嗨,我对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);
我遇到的问题是,我创建的纹理垂直阴影(一个纹理透明,另一个颜色)图案没有被适当地映射,因为某些垂直线比其他垂直线更宽(一种混叠问题) )。是这样我必须在映射时设置纹理坐标吗?
感谢您的回复
人
答案 0 :(得分:15)
如果我正确理解你,你就不能正确处理纹理坐标。使用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-mapping查看GL_TEXTURE_MAG_FILTER
。
它可能已有十多年的历史,但this old Flipcode tutorial仍然具有相关性,值得一看。
编辑:在texcoord调用之前有顶点调用
答案 1 :(得分:3)
如果您编写的代码与代码中的代码完全相同,那么150/8
就是您的问题。这是一个整数除法,不会返回浮点18.75,而是整数18。
将代码更改为浮点值。
150.f/8.f