在 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_FILTERGL_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 中重复纹理的主要内容,如果未能解决你的问题,请参考以下文章

用opengl实现网格[重复]

Opengl 纹理映射和图像分辨率

使用 OpenGL 在 2d 对象上看不到我的纹理 [关闭]

纹理不填充图形 - OpenGL

OpenGL ES纹理

OpenGL-纹理(下)