如何为 gluCylinder() 和 gluDisk() 等函数设置纹理坐标偏移和乘数?
因此,如果通常纹理将从点 0 开始,我想将其设置为从点 0.6 或 3.2 等开始,乘数我的意思是纹理会变大或变小。
解决方案不能是 glScalef() 因为 1) 我使用法线,2) 我也想调整纹理开始位置。
尝试使用纹理矩阵堆栈:
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(0.6f, 3.2f, 0.0f);
glScalef(2.0f, 2.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
drawObject();
该解决方案与 GLU 函数无关,并且确实是glScalef
(以及glTranslatef
用于偏移调整),但将其应用于纹理矩阵(假设您不使用着色器)。通过调用glMatrixMode
with选择的纹理矩阵GL_TEXTURE
在顶点的纹理坐标被插值并用于访问纹理之前转换顶点的纹理坐标(无论这些纹理坐标如何计算,在这种情况下由 GLU 计算,它只是在 CPU 上计算它们并调用glTexCoord2f
)。
因此,要让纹理从 (0.1,0.2) 开始(当然是在纹理空间中)并使其大 2 倍,您只需调用:
glMatrixMode(GL_TEXTURE);
glTranslatef(0.1f, 0.2f, 0.0f);
glScalef(0.5f, 0.5f, 1.0f);
打电话之前gluCylinder
。但请务必在之后恢复这些更改(可能将其包装在 之间glPush/PopMatrix
)。
但是如果你想根据世界空间坐标改变纹理坐标,这可能需要更多的计算。当然,您也可以使用顶点着色器来完全控制纹理坐标的生成。