gluCylinder()和纹理坐标的偏移/倍增?

4

如何为gluCylinder()和gluDisk()等函数设置纹理坐标偏移和倍增器?

如果通常情况下纹理从点0开始,我想通过设置倍增器将其从点0.6或3.2等处开始。我所说的倍增器是指纹理可以变大或变小。

解决方案不能使用glScalef(),因为:1)我正在使用法线;2)我也希望调整纹理起始位置。

2个回答

1

尝试使用纹理矩阵堆栈

glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(0.6f, 3.2f, 0.0f);
glScalef(2.0f, 2.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
drawObject();

难道不应该是glScalef(2.0f, 2.0f, 2.0f)吗?或者只有在使用3D纹理时才会影响Z轴?然而,我也将Z坐标设置为我的乘数,没有发现任何问题。 - Rookie
是的,我相信只有在进行3D纹理或非常不寻常的2D处理时才需要非1.0的Z比例。 - genpfault
@新手请注意,将纹理坐标加倍会使纹理图像在物体上缩小一半。 - Christian Rau

1
解决方案与GLU函数无关,实际上是使用glScalef(和glTranslatef进行偏移调整),但将其应用于纹理矩阵(假设您不使用着色器)。通过调用glMatrixMode并选择GL_TEXTURE纹理矩阵可以转换顶点的纹理坐标,然后在插值使用它们访问纹理之前(无论如何这些纹理坐标如何计算,在这种情况下由GLU计算它们并调用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进行包装)。

但是,如果您想根据世界空间坐标更改纹理坐标,则可能涉及一些更多的计算。当然,您也可以使用顶点着色器完全控制纹理坐标生成。


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