2010-10-06 117 views
5

您好,我对OpenGL相当陌生。在OpenGL中重复纹理

我的任务是在OpenGL中实现GDI画笔以在MAC OS X上绘图。因此,我转向OpenGL中的纹理以首先绘制图案,然后将其映射到绘制基元,如多边形(矩形a例如)。我创建了一个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×0.3和整个窗口为500×500,然后在像素方面所述多边形是150×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); 

我具有垂直阴影线(一个纹理像素透明的其它有色)我已经作为纹理创建图案未被适当地映射在这个意义上,一些垂直线变得比其他宽的问题(一种别名问题)。这是否像这样,我必须在映射时设置纹理坐标?

感谢您的任何答复

回答

3

如果你写的代码是什么,你必须在你的代码,然后150/8是你的问题。这是一个整数除法,并且不会返回浮点数18.75,而是整数18.

将您的代码更改为浮点值。

150.f/8.f 
14

如果我正确地理解了你,你没有正确处理纹理坐标。当使用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次穿过院子使用8.0f的表面代替1.0fs的texCoords呼叫。您还需要确保纹理设置为在绑定纹理后设置为重复设置。

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_MAG_FILTER和MIP映射。

它可能已经过了十年了,但this old Flipcode tutorial仍然相关并值得一看。

编辑:在texcoord调用之前有顶点调用

+0

他如何正确对待texcoords?他完全按照你的建议? TexCoord呼叫来自Vertex呼叫。 – Bahbar 2010-10-06 10:02:24

+0

他正在使用150/8而不是8点。虽然关于通话顺序的好点 - 我多年以来都没有使用过即时模式! – Pike65 2010-10-06 10:57:00

+0

感谢Bahbar我刚刚意识到问题所在,并准备发布解决方案。是的,这是问题!不管怎么说,多谢拉 – user461426 2010-10-07 13:15:53