OpenGL中的纹理坐标

3

非常抱歉问一个初学者级别的问题...

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

有什么好的方法吗?

谢谢。


请提供以下查询的帮助。https://dev59.com/02DVa4cB1Zd3GeqPay07 - Rikki
https://dev59.com/02DVa4cB1Zd3GeqPay07 - Rikki
请提供有关以下查询的帮助https://dev59.com/02DVa4cB1Zd3GeqPay07 - Rikki
4个回答

4

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

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

接下来,您的纹理坐标单位将变为像素。另一种缩放策略是将每个图块缩放为最终单位中的1x1。


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]

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的纹理坐标。

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


0

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


不,永远不会有-1。原因是0.f对应于第一个纹素的左侧,1.f对应于最后一个纹素的右侧。 - Bahbar
1
是的,但从他的 OP 中,我们无法确定他的纹理元素位置是基于 0 还是基于 1 的。如果它们基于 0,并且我们除以宽度(或高度),那么您永远不会得到 1.0f。 - Jim Buck
即使如此,它也会改变偏移量,而不是除数。如果纹理宽度为256,则除数将始终为256。 - Bahbar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接