OpenGL中的纹理坐标

Posted

技术标签:

【中文标题】OpenGL中的纹理坐标【英文标题】:Texture coordinates in OpenGL 【发布时间】:2011-04-24 20:04:49 【问题描述】:

很抱歉提出一个非常菜鸟级别的问题...

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

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

谢谢。

【问题讨论】:

请提供有关以下查询的帮助。 ***.com/questions/9188857/… ***.com/questions/9188857/… 请为以下查询提供帮助***.com/questions/9188857/… 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

假设您想使用从 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]

【讨论】:

【参考方案3】:

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

【讨论】:

不,从来没有-1。原因是,0.f对应第一个纹素的左边,1.f对应最后一个纹素的右边。 是的,但是从他的 OP 来看,不清楚他的纹素位置是基于 0 还是基于 1。如果它们是从 0 开始的,并且我们除以宽度(或高度),您将永远不会得到 1.0f。 即便如此,它也会改变偏移量,而不是分隔符。如果纹理为 256 宽,则分隔线将始终为 256。【参考方案4】:

让我们看一下以下 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。

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

【讨论】:

以上是关于OpenGL中的纹理坐标的主要内容,如果未能解决你的问题,请参考以下文章

opengl中的正交投影和纹理坐标

从帧缓冲区对象读取时,OpenGL 纹理坐标是相反的

OpenGL:纹理坐标实时变化的地形的最佳渲染方法?

OpenGL着色器没有传递正确的纹理坐标

OpenGL 纹理坐标没有影响

无法使用 OpenGL 渲染 FBX 导入的纹理模型