2015-10-25 4 views
1

Почему нет необходимости в swap-буферах или glFinish?Почему WebGL «очищает» рисование переднего буфера?

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Game v.0.0</title> 
     <script> 
      var gl = null; 
      function startGame() 
      { { var canvas = document.getElementById('gameCanvas'); 
        var glNames = ["webgl", "experimental-webgl", "webkit-3d", "moz-webgl"]; 
        for (var glNameI = 0; glNameI < glNames.length; ++glNameI) 
         try 
         { gl = canvas.getContext(glNames[glNameI]); 
          if (gl) break; 
         } 
         catch(e) 
         {} 
        if(!gl) 
        { canvas.outerHTML = "<a>WebGL NOT SUPPORTED? :(</a>"; 
         return; 
        } 
       } 

       window.onkeydown = function(ev) 
       { switch(ev.keyCode) 
        { 
        case 49:// 1 key 
         gl.clearColor(0.3,0.7,0.2,1.0); 
         gl.clear(gl.COLOR_BUFFER_BIT); 
         break; 
        case 50:// 2 key 
         gl.clearColor(0.3,0.2,0.7,1.0); 
         gl.clear(gl.COLOR_BUFFER_BIT); 
         break; 
        } 
       }; 
      } 
     </script> 
     <style type="text/css"> 
      canvas {border: 2px dotted blue;} 
     </style> 
    </head> 

    <body onload="startGame()"> 
     <div><canvas id="gameCanvas" width="640" height="480"></canvas></div> 
    </body> 

</html> 
+0

FYI '' webkit-3d "и' 'moz-webgl" 'не были актуальны, так как WebGL отправлен 4 года назад – gman

ответ

3

Так как это работает WebGL.

WebGL свопы/копии автоматически. Каждый раз, когда вы делаете что-либо, что влияет на рисунок WebGL drawingBuffer (думаю, «backbuffer»), он становится помеченным для обмена/копирования. В следующий раз, когда браузер будет компоновать веб-страницу, он сделает либо своп, либо копию. Вы можете сказать, что он всегда копируется. не может сказать ему, чтобы всегда поменять

в частности, создавая контекст WebGL с {preserveDrawingBuffer: true} как в

gl = someCanvas.getContext("webgl", {preserveDrawingBuffer: true}); 

Сообщает WebGL вы всегда хотите, чтобы сделать копию.

по умолчанию WebGL выбирает своп или копировать в зависимости от различных факторов. Например, если сглаживание включено, это всегда эффективно копия (разрешение) wh Если бы сглаживание не было, это может быть обмен. Кроме того, в этом случае по умолчанию, когда preserveDrawingBuffer является ложным после его копирования или замены, он очистит буфер обмена. Это делается для того, чтобы заставить его казаться последовательным, независимо от того, выбирает он его для копирования или замены.

Если preserveDrawingBuffer = true, то он никогда не очищает буфер обмена.

Если вы хотите выполнить кучу работы над несколькими событиями JavaScript и не позволить пользователю видеть результаты до тех пор, пока все ваши работы не будут выполнены, вам нужно будет отобразить фреймбуфер с прикрепленной текстурой или рендерингом, а затем, когда все ваша работа выполняется, а не прикрепляется к холсту (backbuffer).

как для gl.finish это не-op в WebGL. Это не имеет смысла.