非常抱歉问一个初学者级别的问题...
我想将纹理的特定部分(而不是整个纹理)应用到四边形上。该纹理是一张256x64像素的图片,我想通过指定其左上角和右下角的像素坐标来指定相关部分([0,0]是整个图像的左上角,[256,64]是右下角)。
有什么好的方法吗?
谢谢。
非常抱歉问一个初学者级别的问题...
我想将纹理的特定部分(而不是整个纹理)应用到四边形上。该纹理是一张256x64像素的图片,我想通过指定其左上角和右下角的像素坐标来指定相关部分([0,0]是整个图像的左上角,[256,64]是右下角)。
有什么好的方法吗?
谢谢。
分数答案是正确的,但如果你想使用整数纹理坐标(例如在VBO中),你可以使用GL_TEXTURE
矩阵来改变你的纹理坐标系统:
glMatrixMode(GL_TEXTURE)
glLoadIdentity()
glScalef(1f/256f, 1f/64f, 1f)
接下来,您的纹理坐标单位将变为像素。另一种缩放策略是将每个图块缩放为最终单位中的1x1。
假设你想使用从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]
让我们来看一个简化的例子,这是一个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.0f,0.0f)到(1.0f,1.0f)。在您的情况下,您需要将像素值除以256-1或64-1,具体取决于您正在处理哪个维度。(这假设您实际上想说您的图像范围为[255,63]而不是[256,64],这意味着您的坐标以0为基础而不是以1为基础。)