我对 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);
我遇到的问题是,我作为纹理创建的垂直阴影(一个纹理元素透明,另一种颜色)图案没有正确映射,因为某些垂直线比其他垂直线变得更宽(一种锯齿问题)。难道是这样我贴图的时候还要设置纹理坐标吗?
如果我理解正确的话,你就没有正确处理纹理坐标。使用
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 调用之前进行顶点调用
如果您编写的代码正是您的代码中的内容,那么
150/8
就是您的问题。这是整数除法,不会返回浮点数 18.75,而是返回整数 18。
将代码更改为浮点值。
150.f/8.f