绘制WebGLRenderTarget以进行筛选

时间:2015-03-02 00:58:33

标签: three.js glsl webgl shader gpgpu

将WebGLRenderTarget绘制到屏幕

我正在研究一个GPGPU动画,首先是Joshua Koo的优秀flocking example。为了帮助将来进行任何调试,我想将纹理渲染到屏幕上,但是我得到了奇怪的结果。这是我采取的方法:

  1. 创建一个名为debugScene的新场景。
  2. 创建一个名为cameraRTT的OrthographicCamera。
  3. 创建包含PlaneBufferGeometry和传递着色器的2个网格(posDebugQuad和velDebugQuad)(见下文)。
  4. 将网格添加到debugScene并位于屏幕左侧。
  5. 然后,我执行以下每一帧:

    1. 将posDebugQuad和velDebugQuad的material.uniforms.texture.value设置为现有的位置和力度WebGLRenderTarget对象。
    2. 使用debugScene和cameraRTT渲染到我的WebGLRenderer。
    3. 这会将GPGPU纹理映射到我的网格对象,但会导致位置数据减少到0,0,0(或接近此值)。我只看到一个模糊的灰色球,在屏幕中央旋转着4000只鸟。在这个过程的某个地方,我似乎正在重置位置数据。或许我采取了错误的做法。

      我尝试了很多不同的方法,包括克隆GPGPU WebGLRenderTarget对象以及使用MeshBasicMaterial和map。奇怪的是,如果我使用PerspectiveCamera而不是othographic,定位问题似乎消失了。但是,更奇怪的是,当我尝试将调试网格定位在屏幕的中心时,问题又回来了。为什么网格的x / y值会干扰其纹理像素的绘制?

      以下是我写过的着色器。据我所知,它们不应该改变纹理:

      <!-- debug fragment shader -->
      <script id="fragment_shader_debug" type="x-shader/x-fragment">
          uniform vec2 resolution;
          uniform sampler2D texture;
          void main() {
              gl_FragColor = texture2D(texture, vec2(gl_FragCoord.xy / resolution.xy));
          }
      </script>
      
      <!-- debug vertex shader -->
      <script id="vertex_shader_debug" type="x-shader/x-vertex">
          void main() {
              gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
          }
      </script>
      

      这是rest of the code。任何帮助都会很棒。我已经坚持了很长时间。

0 个答案:

没有答案