OpenGL中的纹理坐标

OpenGL中的纹理坐标,opengl,graphics,3d,textures,Opengl,Graphics,3d,Textures,很抱歉问了一个非常低级的问题 我想将特定的纹理片段(而不是整个纹理)应用于四边形。纹理是256x64图像,我希望能够通过说明其左上角和右下角的像素坐标来指定相关部分([0,0]是整个图像的左上角,[256,64]是右下角) 有什么办法吗 谢谢。您使用基于浮点的纹理坐标,它们的范围从(0.0f,0.0f)到(1.0f,1.0f)。在您的情况下,您可以获取像素值并将其除以256-1或64-1,具体取决于您处理的维度。(假设你真的想说你的图像是[255,63]而不是[256,64],这意味着你的坐标是

很抱歉问了一个非常低级的问题

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

有什么办法吗


谢谢。

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

假设你想使用从10,10开始的20x20 texel,你会使用以下坐标:

[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]

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

相应的纹理坐标为:

 | 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
现在,如果希望子纹理从texels 3到7,则要使用的纹理坐标为2/8到7/8


您还应该注意一些其他的事情:整数纹理坐标不涉及纹理中心,而是它们之间的精确中间;在某些情况下,这可能会导致模糊的外观。

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

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

之后,纹理坐标单位将为像素。另一种缩放策略是缩放,使每个磁贴的最终单位为1x1。

不,从来没有-1。原因是,0.f对应于第一个texel的左边,1.f对应于最后一个texel的右边。是的,但从他的OP来看,不清楚他的texel位置是基于0还是基于1。如果它们是基于0的,我们除以宽度(或高度),则永远不会得到1.0f。即使如此,它也会改变偏移量,而不是分隔器。如果纹理宽度为256,则分割线将始终为256。请提供以下查询的帮助。请提供以下查询的帮助
        glMatrixMode(GL_TEXTURE)
        glLoadIdentity()
        glScalef(1f/256f, 1f/64f, 1f)