我在OpenGL中遇到了3D纹理问题。
我通过
设置纹理glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, 640, 480, 8, 0, GL_RED, GL_UNSIGNED_BYTE, tex3Ddata);
tex3Ddata共有8片640x480位图。现在当我尝试使用纹理坐标访问不同的切片时,由于某种原因图像会相互融合,因此我没有正确设置坐标,但我不知道为什么。纹理切片本身是8位单色。
显示代码:
for(unsigned int i = 0; i < g_numCameras; i++) {
float tx = ((float)i) / ((float)g_numCameras - 1);
//tx = 0.5f; //this is for testing only
float fI = ((float)i) / ((float)g_numCameras);
if( i < (g_numCameras >> 1)) {
glTexCoord3f(0.0f, 1.0f, tx);
glVertex3f( -1.0f + fI * 4.0f, 0.0f, 0.5f);
glTexCoord3f(1.0f, 1.0f, tx);
glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f, 0.0f, 0.5f);
glTexCoord3f(1.0f, 0.0f, tx);
glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f, 1.0f, 0.5f);
glTexCoord3f(0.0f, 0.0f, tx);
glVertex3f( -1.0f + fI * 4.0f, 1.0f, 0.5f);
}
else {
fI -= 0.5f;
glTexCoord3f(0.0f, 1.0f, tx);
glVertex3f( -1.0f + fI * 4.0f, -1.0f, 0.5f);
glTexCoord3f(1.0f, 1.0f, tx);
glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f, -1.0f, 0.5f);
glTexCoord3f(1.0f, 0.0f, tx);
glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f, 0.0f, 0.5f);
glTexCoord3f(0.0f, 0.0f, tx);
glVertex3f( -1.0f + fI * 4.0f, 0.0f, 0.5f);
}
}
g_numCameras是8,所以我希望通过Z坐标0.0f,1 / 7,2 / 7,...,1.0f可以访问切片。但它始终是插值的。我测试了tx = 0.5f;同样,但这也是图像的混合。 x / y坐标正常工作,8个四边形按预期放置,只是通过立方体的切片不能按照我预期的方式工作。
我在这里做错了什么想法? (我无法在3d纹理上找到相应的答案/示例)。
我还通过上传8次相同的图像来测试数据是否合适,并且工作得很好(因为插值会产生原始图像,我在那里得到了原始图像)。
答案 0 :(得分:11)
您遇到的情况是,这些纹理坐标不会解决纹理像素中心,而是纹理像素之间的边缘。假设你有一个8维的1D纹理
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
然后第一个|
位于纹理坐标0.0处,最后一个|
位于纹理坐标1.0
0.0 1.0
0/8 8/8
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
让我写下整套分数:
0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
您要点击的是纹理中心,即条形图之间的数字。 | 1 |在0/8到1/8之间,即(0/8 + 1/8)/ 2 = 1/16,| 2 |在1/8和2/8之间=(1/8 + 2/8)/ 3 = 3/16,依此类推。
所以你想要解决的纹理坐标是 1/16 3/16 5/16 7/16 9/16 11/16 13/16 15/16
或更一般的形式:(1 + 2*t) / 2*dim
答案 1 :(得分:3)
你的期望已经过去了。
每个切片i
(从0开始索引)在(i+0.5) / num_slices
处可用。
0.f表示在第一个切片和边界之间插入,1.f表示在最后一个切片和边界之间插入一半(假设是夹紧)。
事实证明,0.5正好在中间,因此在切片3和4之间(如果开始计数为0)。所以你可以在两个切片之间进行混合。
答案 2 :(得分:2)
可以接听以下内容:
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
我认为应该关闭插值。