【问题标题】:OpenGL 3D Texture CoordinatesOpenGL 3D 纹理坐标
【发布时间】:2011-07-26 04:28:23
【问题描述】:

我在 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 次相同的图像来测试数据是否正确,并且效果很好(因为插值会产生原始图像,所以我在那里得到了原始图像)。

【问题讨论】:

    标签: opengl 3d texture-mapping


    【解决方案1】:

    发生在你身上的是,那些纹理坐标不是针对纹素中心,而是纹素之间的边缘。假设你有一个维度为 8 的一维纹理

    | 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

    【讨论】:

    • 非常感谢,成功了!我可以为此打自己一巴掌;)
    【解决方案2】:

    你的期望已经偏离了。

    每个切片 i(从 0 开始索引)可在 (i+0.5) / num_slices 获得。

    0.f 表示在第一个切片和边界之间插入一半,1.f 表示在最后一个切片和边界之间插入一半(假设钳位)。

    事实证明,0.5 正好在中间,因此在切片 3 和 4 之间(如果从 0 开始计数)。所以你得到了 2 个切片之间的混合。

    【讨论】:

      【解决方案3】:

      是否可以这样调用:

      glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
      glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
      

      我认为这应该关闭插值。

      【讨论】:

      • 我试过这个,因为我也是这么想的,但是立方体中的插值仍然发生
      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 2015-04-23
      • 2015-02-03
      • 2012-03-06
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多