OpenGL中的重复纹理

7

您好,我对OpenGL还不太熟悉。

我的任务是在MAC OS X上实现OpenGL中的GDI画笔。因此,我首先使用OpenGL中的纹理来绘制图案,然后需要将其映射到绘图基元(例如多边形(矩形))。我正在创建一个8x8像素的纹理,并将其映射到以下坐标的多边形上,在一个500x500像素的窗口中:

glVertex3f(0.35, 0.35, 0.0);

glVertex3f(0.35, 0.65, 0.0);

glVertex3f(0.65, 0.65, 0.0);

glVertex3f(0.65, 0.35, 0.0);

由于我需要刷子效果,所以图案必须沿矩形重复。矩形/正方形为0.3 x 0.3,整个窗口为500 x 500,则以像素为单位的多边形为150 x 150。

因此,需要重复的次数为150/8。

因此,我设置了以下纹理坐标:

glTexCoord2f(0.0,       0.0);   glVertex3f(0.35, 0.35, 0.0);
glTexCoord2f(0.0,       150/8); glVertex3f(0.35, 0.65, 0.0);
glTexCoord2f(150/8,     150/8); glVertex3f(0.65, 0.65, 0.0);
glTexCoord2f(150/8,     0.0);   glVertex3f(0.65, 0.35, 0.0);

我有一个问题,我创建的垂直点阵(一个texel透明,另一个着色)纹理在映射时没有被适当地映射,某些垂直线比其他线条更宽(一种抗锯齿问题)。这是不是因为我在映射时需要设置纹理坐标?

谢谢回复!

al

2个回答

17

如果我理解正确,您没有正确处理纹理坐标。使用 glTexCoord2f() 时,纹理从 0.0, 0.0 扩展到 1.0, 1.0。因此,如果您想要有一个填充四边形的纹理,则使用以下代码:

glTexCoord2f(0.0f, 0.0f);    glVertex3f(0.35f, 0.35f, 0.0f);
glTexCoord2f(0.0f, 1.0f);    glVertex3f(0.35f, 0.65f, 0.0f);
glTexCoord2f(1.0f, 1.0f);    glVertex3f(0.65f, 0.65f, 0.0f);
glTexCoord2f(1.0f, 0.0f);    glVertex3f(0.65f, 0.35f, 0.0f);

如果您想在四边形表面上重复纹理8次,请在texCoords调用中使用8.0f代替1.0f。一旦绑定了纹理,您还需要确保设置它为重复。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

那可能是您的问题,但如果您仍然遇到别名问题,请尝试查看 glTexParameteriGL_TEXTURE_MAG_FILTERGL_TEXTURE_MIN_FILTER 以及mip-mapping。

这篇旧的Flipcode教程(链接)虽然已经过了十年,但仍然相关且值得一看。

编辑:在纹理坐标调用之前有顶点调用错误。


他为什么没有正确处理纹理坐标?他完全按照你的建议做了吗?而且纹理坐标调用在顶点调用之前。 - Bahbar
他正在使用150/8而不是8。关于调用顺序的好点子,我已经多年没有使用即时模式了! - Pike65
谢谢Bahbar,我刚意识到问题所在,并准备发布解决方案。是的,那就是问题所在!无论如何还是谢谢你。 - user461426

4
如果您编写的代码确切地就是您在代码中的样子,那么150/8就是您的问题。这是一种整数除法,不会返回浮点数18.75,而是整数18。
请将您的代码更改为浮点值。
 150.f/8.f

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