为什么我不能在 pyOpenGL 中绘制纹理

Why can't I draw a texture in pyOpenGL

如果我禁用纹理,它会正确地绘制一个白色立方体,但是当我启用纹理时,它什么也不会绘制(或与背景颜色相同的黑色方块)。我唯一怀疑的是 GL_INT 因为到目前为止我只在我的项目中使用无符号字节。

编辑:我的 window 是 RGB

这是我的代码:

    self.texture = glGenTextures(1)
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glPixelStorei(GL_PACK_ALIGNMENT, 1)
    glBindTexture(GL_TEXTURE_2D, self.texture)
    pix=[255,255,255,0,0,0,255,255,255,0,0,0]
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0.0, 640, 480, 0.0, 0.0, 100.0)
    glMatrixMode(GL_MODELVIEW)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
    glTexImage2D(GL_TEXTURE_2D, 0, 3, 2, 2, 0, GL_RGB, GL_INT, pix)
    glEnable(GL_TEXTURE_2D)
    glDisable( GL_LIGHTING)
    glBegin(GL_QUADS);
    glTexCoord2i(0, 0); glVertex2i(100, 100)
    glTexCoord2i(0, 1); glVertex2i(100, 200)
    glTexCoord2i(1, 1); glVertex2i(200, 200)
    glTexCoord2i(1, 0); glVertex2i(200, 100)
    glEnd()
    glutSwapBuffers()

嗯,您不应该将客户端内存中的图像数据格式与纹理的 内部格式 混淆。在您的情况下,您使用 3 作为 internalFormat 参数,这是 GL_RGB 的已弃用快捷方式,实际上意味着每个通道 8 位 RGB 数据。

当您使用 GL_INT 作为客户端格式时,GL 会将数据 转换 为内部格式。在这种情况下,它会将您的数据解释为规范化整数,因此 INT_MAX(大约 20 亿左右)将映射到 1.0。由于您只使用最多 255 的数字,因此无论如何这些在内部纹理格式中最终都会为零,因此您的纹理实际上是黑色的。

我不知道你到底想做什么。使用比内部格式精度更高的客户端格式几乎不是一个好主意,因为无论如何都会丢失所有精度,并且由于额外的转换,数据传输会变慢。如果您需要 更高的精度,您实际上应该使用某种内部格式,每个通道具有更多位。但是,我完全不清楚你是否真的想要那个,特别是因为你使用的是固定功能管道

好的,我通过反复试验发现数组需要是3D的。这个数组对我有用(3 * 4 * 3 维)我用 glTexImage2Df 这个:

pix=[[[1.0,1.0,0.0],[0.0,0.0,0.0],[1.0,1.0,1.0],[0.0,0.0,0.0]],[[1.0,1.0,1.0] ,[0.0,0.0,0.0],[1.0,1.0,1.0],[0.0,0.0,0.0]],[[1.0,1.0,1.0],[0.0,0.0,0.0],[1.0,1.0,1.0] ,[0.0,0.0,0.0]]]