2011-06-02 173 views
1

我仍然試圖掌握使用紋理,現在我試圖使用glTexCoordPointer爲每個頂點賦予一個特定於它的類的顏色。我做了一些檢查,這裏的情況是:glTexCoordPointer似乎沒有效果

self.bufferVertices = glGenBuffersARB(1) 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices) 
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(vertices), ADT.voidDataPointer(vertices), GL_STATIC_DRAW_ARB) 
    self.vertices = vertices 
    self.bufferNormals = glGenBuffersARB(1) 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals) 
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(normals), ADT.voidDataPointer(normals), GL_STATIC_DRAW_ARB) 
    self.normals = normals 
    self.triangles = triangles 
    textureIndexes = [] 
    for int in areas: 
     textureIndexes.append(float(int)/190.0) 
     print str(int) + " " + str(float(int)/190) 
    print str(len(self.vertices)) + str(len(textureIndexes))  
    self.bufferTextureIndex = glGenBuffersARB(1) 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex) 
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(numpy.array(textureIndexes,dtype=numpy.float32)), ADT.voidDataPointer(numpy.array(textureIndexes,dtype=numpy.float32)), GL_STATIC_DRAW_ARB)    
    for color in textureArray: 
     print str(color) 
    self.texture = glGenTextures(1) 
    glBindTexture(GL_TEXTURE_1D, self.texture) 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT) 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT) 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) 
    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray) 

所以我生成我VBO對頂點,法線,三角形和textureIndexes。現在我想檢查我得到的textureIndexes的值,全部來自區間[0..1]和textureIndexes = length(vertices)/ 3的長度。

對於紋理,我生成了一個textureArray這是190 [x,x,x] rgb值的向量。我甚至將它分成了6個相等的部分。因此,前1/6項是另一種顏色,以此來簡化我的測試。

現在的圖紙:

glEnableClientState(GL_VERTEX_ARRAY)   
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices) 
    glVertexPointer(3, GL_FLOAT, 0, None)   
    glEnableClientState(GL_NORMAL_ARRAY); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals) 
    glNormalPointer(GL_FLOAT, 0, None)  


    glEnableClientState(GL_TEXTURE_COORD_ARRAY) 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex) 
    glTexCoordPointer(1, GL_FLOAT, 0, None); 
    glBindTexture(GL_TEXTURE_1D, self.texture) 
    glEnable(GL_TEXTURE_1D) 
    glClientActiveTexture(GL_TEXTURE0); 
    glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles)) 

但所有的點都轉向了相同的顏色,對應於我的紋理的第一部分1/6的顏色。任何輸入將非常感激。

+0

你剛剛重新啓動你的問題? – 2011-06-02 12:41:50

+0

確切的重複:http://stackoverflow.com/questions/6185478/opengl-textures-beginner-question – 2011-06-02 12:43:05

回答

0

我很驚訝它繪製任何東西。在下面一行有一個錯誤:

glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray) 

OpenGL規範要求紋理的大小是2的冪。如果你用256或64替換190,你可能會得到更好的結果。

+0

不一定。只有在較舊的硬件上才需要(不支持'ARB_texture_non_power_of_two'擴展名或OpenGL 2.0)。雖然ATI的人似乎看到這有點不同;)。但值得一試,因爲波格丹可以使用舊硬件或破損的ATI卡。 – 2011-06-13 21:40:03

+0

我檢查了規範,你是對的。然而,我仍然有兩個紋理的非力量,特別是在我的ATI筆記本電腦(這應該在理論上支持OpenGL 2 ...)的功率相當混合的結果。無論如何,這將很容易檢查,雖然它可能不會成爲問題。 – Mikola 2011-06-13 21:56:15

+0

感謝您的觀察。我的顯卡確實支持OpenGL 2.0,所以沒有問題。然而,應用程序應該能夠在較舊的卡上運行,這將是一個問題。 – Bogdan 2011-06-14 08:30:03

相關問題