我正在使用OpenGL ES fluid simulation,它使用纹理贴图来保存网格值。我需要遍历直通模仿下面的循环电网:内插纹理坐标
for (int r = 0; r < 128; r++)
for (int c = 0; c < 128; c++)
process grid element at (c,r)
要通过网格迭代我只是填补这导致调用每个片段我的片段程序的四边形。纹理坐标(0,0),(1,0),(0,1),(1,1) 与顶点(-1,-1),(+ 1,-1), 1,+ 1),(+ 1,+ 1)和I呈现四边形(如三角形带)插入连接到FBO作为128×128纹理贴图如下:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, texFrameBuffer);
glViewport(0, 0, TEX_IMAGE_WIDTH, TEX_IMAGE_HEIGHT); // 128 x 128
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glEnableVertexAttribArray(positionAttr);
glVertexAttribPointer(positionAttr, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, texCoordBuffer);
glEnableVertexAttribArray(texCoordAttr);
glVertexAttribPointer(texCoordAttr, 2, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
顶点着色器仅经过位置并通过未修改的纹理坐标。为了理解生成的纹理坐标,我决定将纹理坐标捕捉到图像中。该片段程序分配其给定2D纹理坐标为输出颜色的红色和绿色通道:
varying vec4 texCoord;
void main() {
gl_FragColor = vec4(texCoord.st,0,1);
}
我然后使用glGetTexImage()
读出纹理图像回客户端的空间。 以下是图像中的每个像素所生成的纹理坐标(S,T)的样品:
(column, row) = [s, t] -> (128*s, 128*t)
(0,0) = [0.00392157, 0.00392157] -> (0,0)
(1,0) = [0.01176471, 0.00392157] -> (1,0)
(2,0) = [0.01960784, 0.00392157] -> (2,0)
(3,0) = [0.02745098, 0.00392157] -> (3,0)
(4,0) = [0.03529412, 0.00392157] -> (4,0)
(5,0) = [0.04313726, 0.00392157] -> (5,0)
(6,0) = [0.05098040, 0.00392157] -> (6,0)
(7,0) = [0.05882353, 0.00392157] -> (7,0)
(8,0) = [0.06666667, 0.00392157] -> (8,0)
(9,0) = [0.07450981, 0.00392157] -> (9,0)
(10,0) = [0.08235294, 0.00392157] -> (10,0)
<snip>
(125,0) = [0.98039222, 0.00392157] -> (125,0)
(126,0) = [0.98823535, 0.00392157] -> (126,0)
(127,0) = [0.99607849, 0.00392157] -> (127,0)
(0,1) = [0.00392157, 0.01176471] -> (0,1)
(1,1) = [0.01176471, 0.01176471] -> (1,1)
(2,1) = [0.01960784, 0.01176471] -> (2,1)
<snip>
(124,127) = [0.97254908, 0.99607849] -> (124,127)
(125,127) = [0.98039222, 0.99607849] -> (125,127)
(126,127) = [0.98823535, 0.99607849] -> (126,127)
(127,127) = [0.99607849, 0.99607849] -> (127,127)
我们的问题。我想了解这些生成的坐标。 魔术值是(0.5 * 1/127.5)
。我理解这个0.5因子是一个预先加入的舍入值,但为什么是127.5? (0.5 * 1/128.0)
会更有意义吗?谁能解释这些坐标吗?我只想从纹理坐标生成整数网格坐标(OpenGL ES中没有sampler2Drect
)。
你能澄清这句话吗?“想象一下你的网格有128行。”请? – 2012-05-10 17:23:52
谢谢,@JohnFisher。我修复了我乱码的句子。 – certainmagic 2012-05-11 04:58:47