2011-12-14 198 views
0

我想了解紋理渲染的工作原理以及如何使用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 

我不認爲這是問題,但我正在手動計算每個對象的紋理座標(計算'sorrounding sphere'與來自對象中心thro的向量的交集每個頂點)。

如果您想查看代碼的其他部分,請詢問。任何暗示或建議將不勝感激。

編輯:也許問題是,我結合使用glTexCoord2f()glBegin(GL_POINTS),並且爲了它的應用紋理的表面,應與GL_QUADSGL_TRIANGLES或其他任何表面上使用?事情是,我的對象的邊不是由確定的多邊形類型組成:主要是三角形,但也有四邊形。

+0

嗯,就是這樣。我將調用移至`glTexCoord2f()`函數,以計算對象的邊: – freieschaf 2011-12-15 14:52:52

回答

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 

而且,我只是把它稱之爲showSides()之前移位glEnable(GL_TEXTURE_2D)到主可視化功能。