OpenGL中的纹理坐标

时间:2011-04-24 20:04:50

标签: opengl graphics 3d textures

对于一个真正的noob级问题抱歉...

我想将一个特定的纹理(不是整个纹理)应用到四边形。纹理是256x64图像,我希望能够通过说明其左上角和右下角的像素坐标来指定相关的部分([0,0]是整个图像的左上角和[256,64]是右下角。)

关于如何做到这一点的任何想法?

感谢。

4 个答案:

答案 0 :(得分:4)

分数答案是正确的,但如果你想使用整数纹理坐标(例如在VBO中),你可以使用GL_TEXTURE矩阵来改变纹理坐标系:

        glMatrixMode(GL_TEXTURE)
        glLoadIdentity()
        glScalef(1f/256f, 1f/64f, 1f)

之后,纹理坐标单位将是像素。另一种缩放策略是缩放,因此每个图块在最终单位中为1x1。

答案 1 :(得分:1)

想象你想使用从10,10开始的20x20纹素,你可以使用以下坐标:

[10.f/256.f,10.f/64.f]
[30.f/256.f,10.f/64.f]
[30.f/256.f,30.f/64.f]
[10.f/256.f,30.f/64.f]

答案 2 :(得分:0)

使用基于浮点的纹理坐标,其范围从(0.0f,0.0f)到(1.0f,1.0f)。在您的情况下,您将获取像素值并将其除以256-1或64-1,具体取决于您要处理的维度。 (这假设你真的想说你的图像是[255,63]而不是[256,64],这意味着你的坐标是从0开始而不是从1开始。)

答案 3 :(得分:0)

让我们看一下以下,宽度为8像素的1D纹理的简化示例(像素中心位于数字处):

 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 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

现在,如果你想要纹素3到7的子纹理,那么使用的纹理坐标是2/8到7/8。

您还应注意其他内容:整数纹理坐标不会解决纹素中心,而是它们之间的确切中间位置;在某些情况下,这可能会导致外观模糊。