我正在尝试了解纹理渲染如何工作的基础知识,并使用 pyopengl 完成它,因为我已经使用它一段时间了。
我已经阅读了一些文档,从红皮书到教程,但我的程序没有渲染任何纹理 - 它只是改变(变暗)绘制对象表面的颜色。
这是相关代码:读取图像文件,设置纹理属性并启用它的函数,
def generateTexture(texPath):
im = Image.open(texPath)
texData = im.tostring('raw', 'RGBX', 0, -1)
texName = [0]
glGenTextures(1, texName)
glBindTexture(GL_TEXTURE_2D, texName[0])
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData)
glEnable(GL_TEXTURE_2D)
return texName
以及创建对象顶点可视化列表的函数,
def showVertices(obj):
Vertices_List = glGenLists(1)
glNewList(Vertices_List,GL_COMPILE)
texNames = generateTexture('tex_stone.jpg')
glBindTexture(GL_TEXTURE_2D, texNames[0])
glColor3f(1.0,1.0,1.0)
glBegin(GL_POINTS)
i=0
while i < obj.nv:
glNormal3f(obj.vnormals[i].x, obj.vnormals[i].y, obj.vnormals[i].z)
glTexCoord2f(obj.texcoords[i].x, obj.texcoords[i].y)
glVertex3f(obj.vertices[i].x,obj.vertices[i].y,obj.vertices[i].z)
i = i + 1
glEnd()
glEndList()
return Vertices_List
我不认为这是问题所在,但我正在手动计算每个对象的纹理坐标(计算“环绕球体”与从对象中心到每个顶点的向量的交点)。
如果您想查看代码的任何其他部分,请询问。任何提示或建议将不胜感激。
编辑:也许问题是我与 andglTexCoord2f()
结合使用glBegin(GL_POINTS)
,以便将纹理应用于表面,应该与GL_QUADS
或GL_TRIANGLES
任何其他表面一起使用?问题是我的对象的边不是由确定的多边形类型组成的:主要是三角形,但也有四边形。