OpenGL 中的重复纹理

问题描述 投票:0回答:2

我对 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);

我遇到的问题是,我作为纹理创建的垂直阴影(一个纹理元素透明,另一种颜色)图案没有正确映射,因为某些垂直线比其他垂直线变得更宽(一种锯齿问题)。难道是这样我贴图的时候还要设置纹理坐标吗?

opengl
2个回答
18
投票

如果我理解正确的话,你就没有正确处理纹理坐标。使用

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);

这可能是您的问题,但如果您仍然遇到锯齿问题,请尝试使用

glTexParameteri
GL_TEXTURE_MAG_FILTER
以及 mip 映射来研究
GL_TEXTURE_MAG_FILTER

它可能已经有十多年的历史了,但是这个旧的 Flipcode 教程仍然具有相关性并且值得一看。

编辑:在 texcoord 调用之前进行顶点调用


4
投票

如果您编写的代码正是您的代码中的内容,那么

150/8
就是您的问题。这是整数除法,不会返回浮点数 18.75,而是返回整数 18。

将代码更改为浮点值。

 150.f/8.f
© www.soinside.com 2019 - 2024. All rights reserved.