glTexCoordPointer似乎没有效果
我仍然试图掌握使用纹理,现在我试图使用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的颜色。任何输入将非常感激。
我很惊讶它绘制任何东西。在下面一行有一个错误:
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray)
OpenGL规范要求纹理的大小是2的幂。如果你用256或64替换190,你可能会得到更好的结果。
不一定。只有在较旧的硬件上才需要(不支持'ARB_texture_non_power_of_two'扩展名或OpenGL 2.0)。虽然ATI的人似乎看到这有点不同;)。但值得一试,因为波格丹可以使用旧硬件或破损的ATI卡。 – 2011-06-13 21:40:03
我检查了规范,你是对的。然而,我仍然有两个纹理的非力量,特别是在我的ATI笔记本电脑(这应该在理论上支持OpenGL 2 ...)的功率相当混合的结果。无论如何,这将很容易检查,虽然它可能不会成为问题。 – Mikola 2011-06-13 21:56:15
感谢您的观察。我的显卡确实支持OpenGL 2.0,所以没有问题。然而,应用程序应该能够在较旧的卡上运行,这将是一个问题。 – Bogdan 2011-06-14 08:30:03
你刚刚重新启动你的问题? – 2011-06-02 12:41:50
确切的重复:http://*.com/questions/6185478/opengl-textures-beginner-question – 2011-06-02 12:43:05