在pyopengl中渲染纹理

时间:2011-12-14 19:51:00

标签: 3d textures pyopengl

我正在尝试获取纹理渲染的基础知识,并使用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

我不认为这是问题所在,但我手动计算每个物体的纹理坐标(计算'周围球体'与物体中心通过每个顶点的矢量的交点)。

如果您想查看代码的其他任何部分,请询问。任何提示或建议将不胜感激。

编辑:可能问题是我将glTexCoord2f()glBegin(GL_POINTS)结合使用,并且为了将纹理应用于曲面,应与GL_QUADS一起使用,{ {1}}或任何其他表面?问题是我的对象的边不是由确定的多边形类型组成的:主要是三角形,但也有四边形。

1 个答案:

答案 0 :(得分:0)

嗯,就是这样。我将调用glTexCoord2f()移动到计算对象边的函数:

def showSides(obj):
Sides_List = glGenLists(1)
glNewList(Sides_List,GL_COMPILE)
texNames = generateTexture('tex_pattern.jpg')
glColor3f(1.0,1.0,0.0)
i = 0
while i < obj.ns:
    j = 0
    glBegin(GL_POLYGON)        
    while j < len(obj.sides[i]):
        glNormal3f(obj.vnormals[obj.sides[i][j]].x, obj.vnormals[obj.sides[i][j]].y, obj.vnormals[obj.sides[i][j]].z)
        glTexCoord2f(obj.texcoords[obj.sides[i][j]].x, obj.texcoords[obj.sides[i][j]].y)
        glVertex3f(obj.vertices[obj.sides[i][j]].x, obj.vertices[obj.sides[i][j]].y, obj.vertices[obj.sides[i][j]].z)
        j = j + 1
    glEnd()
    i = i + 1
glEndList()
return Sides_List

此外,我在调用glEnable(GL_TEXTURE_2D)之前将showSides()移至主要的可视化功能。