openGL纹理初学者问题 - 1D纹理创建?

时间:2011-05-31 09:22:24

标签: opengl pyopengl

修改

好的,我在纹理渲染中添加了一些更改,现在我看起来并不是我想要的但是在我尝试改变任何东西之前我只想确定我在右边路径。我想解决的问题是:我有180000个顶点。他们每个人都可以来自190个“班级”中的一个。每个类可以在不同的时间分配不同的颜色。因此,我正在尝试使用190种颜色创建纹理,并且对于180000个顶点中的每一个都具有相应类的textureCoord。所以对于一些代码:

    self.bufferTextureIndex = glGenBuffersARB(1)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex)
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(textureIndexes), ADT.voidDataPointer(textureIndexes), GL_STATIC_DRAW_ARB)               

    self.texture = glGenTextures(1)
    glBindTexture(GL_TEXTURE_1D, self.texture)
    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)

所以textureIndexes是来自[0..1]的浮点数组。 len(textureIndexes)是我正在使用的顶点数(180000)。对于纹理,textureArray包含190 * 3个浮点数,对应于每个类所需颜色的RBG。

绘图部分:

    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)       
    if type == GL_POINTS:
        glDrawArrays( GL_POINTS, 0, len(self.vertices) / 3 ); 
    else: 
        glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))

这种方法看起来是对的吗?结果不是我所期待的,但可能是我选择的颜色编码,如果主要方法是好的,我可以进一步看看。我认为很可能索引构建错误。为了构建它们,我有一个数字在0到190之间的文件,对应于每个索引的类。所以到目前为止我的索引构建只是读取索引然后索引/ 190为每个顶点得到[0..1]中的数字

EDIT2 所以我接受了你的建议,做了索引+ 0.5 / 190来生成我的索引。我正在打印indice数组的长度和值。它是60000,所有数字都在0到1之间,大多在0.3到0.95之间。但我的所有顶点仍然是相同的颜色。所以我唯一没有检查过的是1D纹理生成。也许这就是我弄错了:

    i = 0
    while i < 30:
        textureArray.append([1,0,0])
        i = i + 1
    while i < 60:
        textureArray.append([1,1,0])
        i = i + 1
    while i < 90:
        textureArray.append([1,1,1])
        i = i + 1
    while i < 120:
        textureArray.append([0,1,1])
        i = i + 1
    while i < 150:
        textureArray.append([0,0,1])
        i = i + 1
    while i < 190:
        i = i + 1 
        textureArray.append([0,0,0])

这是我生成纹理数组的方法。这不是实际的解决方案,而是出于测试原因。所以我的纹理应该是1/6红色 - 1/6 ....如上所述的纹理生成:

    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)

这个纹理生成正确吗?因为即使我的索引范围像我之前提到的那样,我的所有顶点都具有纹理中第一种颜色的颜色。有趣的是,如果我“省略”glBindBufferARB(GL_ARRAY_BUFFER_ARB,self.bufferTextureIndex)形成绘图并让法线代替纹理索引我会得到一些不同的颜色,但textureIndexes似乎都指向了第一种颜色从我的纹理。我上传了两个带有textureIndices和normals实际值的示例文件。不知道为什么第一个不起作用,但第二个似乎工作(不能真正验证它们是否是正确的颜色,但至少它们是不同的)。 http://www.megafileupload.com/en/file/315895/textureIndices-txt.html http://www.megafileupload.com/en/file/315894/normalsTest-txt.html

EDIT3

所以现在我的指数似乎有效。这是一个示例图像:

http://i.stack.imgur.com/yvlV3.png

然而奇怪的部分是,你可以看到边界没有正确定义。这可以通过我传递给纹理的一些参数以任何方式受到影响,还是应该三重检查我的textureIndex创建?

1 个答案:

答案 0 :(得分:1)

  1. 目前您使用法线作为纹理坐标,因为self.bufferNormals在调用glTexCoordPointer时被绑定了。 1D纹理不仅仅是每个顶点颜色。它们可以通过每顶点纹理坐标访问,比如2D纹理,否则它们将成为每顶点颜色的无用替代品。如果您不理解,请阅读一些关于OpenGL纹理或纹理的介绍性材料。

  2. 如上所述,绝对不是。

  3. 编辑:根据您的最新问题(带屏幕截图的问题),请记住,当单个三角形的顶点具有不同的纹理坐标时(在您的情况下,它们将属于不同的类,我认为不应该发生),texCoords在三角形内插,然后用于获得纹理颜色。因此,如果您不希望这种情况发生,我必须确保三角形的所有顶点都具有相同的texCoord(我想这是)。因此,您必须沿“材质类”边框复制顶点。也许你可以通过设置glShadeModel(GL_FLAT)来获得一个快速而肮脏的解决方案,但这也会使照明变平,并且不确定边界三角形属于哪个类。