在 OpenGL 中重复纹理
Posted
技术标签:
【中文标题】在 OpenGL 中重复纹理【英文标题】:Repeating Textures in OpenGL 【发布时间】:2010-10-06 07:52:18 【问题描述】:您好,我对 OpenGL 很陌生。
我的任务是在 OpenGL 中实现 GDI 画笔,以便在 MAC OS X 上绘图。因此,我转向 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);
我有一个问题,即我作为纹理创建的垂直阴影(一个纹素透明,另一种颜色)图案没有被适当映射,因为某些垂直线比其他垂直线变得更宽(一种锯齿问题)。是不是这样我必须在贴图的时候设置纹理坐标?
感谢任何回复
al
【问题讨论】:
【参考方案1】:如果我对您的理解正确,您就没有正确处理纹理坐标。当使用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 代替 texCoords 调用中的 1.0fs。您还需要确保在绑定纹理后将纹理设置为重复设置。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
这可能是您的问题,但如果您仍然遇到混叠问题,请尝试使用 GL_TEXTURE_MAG_FILTER
和 GL_TEXTURE_MAG_FILTER
以及 mip-mapping 查看 glTexParameteri
。
它可能已有十多年的历史,但this old Flipcode tutorial 仍然相关且值得一看。
编辑:在 texcoord 调用之前进行了顶点调用
【讨论】:
他怎么没有正确对待 texcoords ?他完全按照你的建议做??并且 TexCoord 调用在顶点调用之前。 他使用的是 150/8 而不是 8。不过,关于呼叫顺序的要点很好 - 我已经多年没有使用即时模式了! 感谢 Bahbar 我刚刚意识到问题所在,并准备发布解决方案。是的,这就是问题所在!还是谢谢【参考方案2】:如果您编写的代码与您的代码完全相同,那么150/8
就是您的问题。这是一个整数除法,不会返回浮点数 18.75,而是整数 18。
将代码更改为浮点值。
150.f/8.f
【讨论】:
以上是关于在 OpenGL 中重复纹理的主要内容,如果未能解决你的问题,请参考以下文章