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中的纹理坐标的主要内容,如果未能解决你的问题,请参考以下文章