嗨,我是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×0.3,整个窗口是500×500,那么就像素而言,多边形是150×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);
Run Code Online (Sandbox Code Playgroud)
我有一个问题是,我创建的纹理垂直阴影(一个纹理透明,另一个颜色)图案没有被适当地映射,因为某些垂直线比其他垂直线更宽(一种混叠问题).是这样我必须在映射时设置纹理坐标吗?
谢谢你的回复
人
Pik*_*e65 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);
Run Code Online (Sandbox Code Playgroud)
如果你想在四边形表面重复纹理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);
Run Code Online (Sandbox Code Playgroud)
这可能是你的问题,但如果你仍然遇到别名问题,请尝试glTexParameteri使用GL_TEXTURE_MAG_FILTERand GL_TEXTURE_MAG_FILTER和mip-mapping.
它可能已有十多年的历史,但这个旧的Flipcode教程仍然具有相关性,值得一看.
编辑:在texcoord调用之前有顶点调用
如果您编写的代码与您的代码完全相同,那么150/8就是您的问题。这是整数除法,不会返回浮点数 18.75,而是返回整数 18。
将代码更改为浮点值。
150.f/8.f
Run Code Online (Sandbox Code Playgroud)