Opengl es 插值纹理坐标
我正在开发一个OpenGL ES,它使用纹理贴图来保存网格值。我需要通过模拟以下循环的网格进行迭代:Opengl es 插值纹理坐标,opengl-es,grid,texture-mapping,Opengl Es,Grid,Texture Mapping,我正在开发一个OpenGL ES,它使用纹理贴图来保存网格值。我需要通过模拟以下循环的网格进行迭代: for (int r = 0; r < 128; r++) for (int c = 0; c < 128; c++) process grid element at (c,r) 顶点着色器仅通过未修改的对象传递位置和纹理坐标。为了了解生成的纹理坐标,我决定将纹理坐标捕捉到图像中。片段程序将其给定的2D纹理坐标指定给输出颜色的红色和绿色通道: varying ve
for (int r = 0; r < 128; r++)
for (int c = 0; c < 128; c++)
process grid element at (c,r)
顶点着色器仅通过未修改的对象传递位置和纹理坐标。为了了解生成的纹理坐标,我决定将纹理坐标捕捉到图像中。片段程序将其给定的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)
(列,行)=[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)
(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)
(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.00392157
是(0.5*1/127.5)
。我理解0.5因子是一个预加的舍入值,但为什么是127.5<代码>(0.5*1/128.0)会更有意义吗?有人能解释这些坐标吗?我只想从纹理坐标生成整数网格坐标(在OpenGL ES中没有sampler2Drect
。我一直在努力解决这个问题,所以让我们看看是否可以解释它
想象你的网格中有一行。在下图中,我对该行中的每个片段(0-127)进行了编号。我也在像素下面放了一些纹理坐标。请注意,最左边的边为0.0,最右边的边为1.0
+-----------+-----------+-----------+-----------+--- ---+-----------+
| | | | | | |
| | | | | | |
| 0 | 1 | 2 | 3 | . . . | 127 |
| | | | | | |
| | | | | | |
+-----------+-----------+-----------+-----------+--- ---+-----------+
^ ^ ^ ^ ^ ^
| | | | | |
| | | | | |
0/128 1/128 2/128 3/128 127/128 128/128
当渲染器想要对片段进行纹理处理时,它使用片段中心的纹理坐标,其中的数字为。请注意,片段0的中心位于0/128(aka 0)和1/128(aka.0078125)之间的中间。这是1/256(又名00390625)
因此,我认为这个公式最好表述为:
coordinate = (pixelId + 0.5) / 128
下面是一些python,它们得到了与您类似的答案:
for i in range(128):
print (0.5 + i) / 128
0.00390625
0.01171875
0.01953125
0.02734375
0.03515625
0.04296875
...
0.97265625
0.98046875
0.98828125
0.99609375
我怀疑我的结果与您的结果之间的差异与以下事实有关:您的值被压缩到一个[8位]颜色通道中,以从着色器返回它们
我希望这会有帮助。你能把这句话弄清楚吗,“想象一下你的128行网格。”?
for i in range(128):
print (0.5 + i) / 128
0.00390625
0.01171875
0.01953125
0.02734375
0.03515625
0.04296875
...
0.97265625
0.98046875
0.98828125
0.99609375