首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebGL:粒子引擎使用FBO,如何正确地从纹理中写入和采样粒子位置?

WebGL:粒子引擎使用FBO,如何正确地从纹理中写入和采样粒子位置?
EN

Stack Overflow用户
提问于 2013-06-03 19:26:35
回答 2查看 2.2K关注 0票数 1

我怀疑我没有正确地将粒子位置呈现给我的FBO,或者在渲染时正确地采样这些位置,尽管这可能不是我的代码的实际问题,当然。

我有一个完整的小提琴在这里http://jsfiddle.net/p5mdv/53/

守则简介:

Initialization:

  1. 在x,y,z中创建一个随机粒子位置数组
  2. 创建一个纹理取样位置数组(例如,对于2个粒子,第一个粒子在0,0,然后在0.5,0)
  3. 创建一个帧缓冲对象和两个粒子位置纹理(一个用于输入,一个用于输出)
  4. 创建一个全屏四角体( -1,-1到1,1)

粒子模拟:

  1. 使用粒子程序(绑定帧缓冲区,将视口设置为我的粒子位置纹理的尺寸,绑定输入纹理,并从-1,-1到1,1)绘制一个四角体。输入和输出纹理被交换每帧。
  2. 粒子碎片着色器在当前碎片位置(gl_FragCoord.xy)对颗粒纹理进行采样,进行一些修改,并写出修改后的位置。

粒子绘制:

  1. 使用纹理采样位置的顶点缓冲区绘制
  2. 顶点着色器利用采样位置对粒子位置纹理进行采样,然后利用视图投影矩阵对其进行变换。
  3. 使用雪碧纹理(gl.POINTS)绘制粒子

问题:

  1. 在粒子模拟步骤中,是否正确地设置了FBO的视口?也就是说,我是否正确地呈现了一个全屏四角体? // 6二维角=12个顶点var vertexBuffer =新的Float32Array( 12 );// -1,-1至1,1屏幕四vertexBuffer = -1;vertexBuffer1 = -1;vertexBuffer2 = -1;vertexBuffer3 = 1;vertexBuffer4 = 1;vertexBuffer5 = 1;vertexBuffer6 = -1;vertexBuffer7 = -1;vertexBuffer8 = 1;vertexBuffer9 = 1;vertexBuffer10 = 1;vertexBuffer11 = -1;//创建带有此数据g.particleSystem.vertexObject =gl.createBuffer()的GL缓冲器;gl.bindBuffer(g.particleSystem.vertexObject,g.particleSystem.vertexObject);gl.bindBuffer(g.particleSystem.vertexObject);gl.bufferData(gl.ARRAY_BUFFER,vertexBuffer,gl.STATIC_DRAW);gl.viewport(0,0,g.particleSystem.particleFBO.width,g.particleSystem.particleFBO.height);. //将四角设置为顶点缓冲区gl.bindBuffer(gl.ARRAY_BUFFER,g.screenQuad.vertexObject);gl.vertexAttribPointer(0,2,gl.FLOAT,false,0,0);//绘图!gl.drawArrays(gl.TRIANGLES,0,6);
  2. 我是否正确地设置纹理坐标来采样粒子的位置? 用于( var i=0;i

相关着色器:

粒子模拟破片着色器:

代码语言:javascript
复制
precision mediump float;

uniform sampler2D mParticleTex;

void main()
{
    // Current pixel is the particle's position on the texture
    vec2 particleSampleCoords = gl_FragCoord.xy;
    vec4 particlePos = texture2D(mParticleTex, particleSampleCoords);

    // Move the particle up
    particlePos.y += 0.1;
    if(particlePos.y > 2.0)
    {
        // Reset
        particlePos.y = -2.0;
    }

    // Write particle out to texture
    gl_FragColor = particlePos;
}

粒子渲染顶点着色器:

代码语言:javascript
复制
attribute vec4 vPosition;

uniform mat4 u_modelViewProjMatrix;

uniform sampler2D mParticleTex;

void main()
{
    vec2 particleSampleCoords = vPosition.xy;
    vec4 particlePos = texture2D(mParticleTex, particleSampleCoords);
    gl_Position = u_modelViewProjMatrix * particlePos;
    gl_PointSize = 10.0;
}

如果没有其他方法,请告诉我是否有更好的方法来调试它。我正在使用webgl-debug查找gl错误,并尽可能地将其记录到控制台。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-13 21:35:05

发现问题了。

gl_FragCoord从0,0到屏幕宽度,屏幕高度,我错误地认为它是从0,0到1,1。

我必须输入阴影变量的宽度和高度,然后标准化的样本坐标,然后从纹理取样。

票数 1
EN

Stack Overflow用户

发布于 2013-06-04 11:32:38

您的四边形正远离视图,所以我尝试添加gl.disable(gl.CULL_FACE),但仍然没有结果。

然后我注意到,当调整窗口面板的画布尺寸时,它实际上显示了一个黑色的方形粒子。因此,渲染循环似乎不太好。

如果您查看控制台日志,它无法加载粒子映像,并且它还指出FBO大小为512x1,这不是很好。

有些函数声明不存在,如getTexSize。(?!)

代码需要整理和分组,如果您已经在使用它,请始终检查控制台。

希望这能帮点忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16904340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档