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

2024-04-28 19:55:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

编辑:我的窗口是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()

Tags: self绘制rgbintalignment纹理glpix
2条回答

好的,我通过反复试验发现数组必须是3D的。这个数组对我很有效(3*4*3维),我使用了glTexImage2Df和以下内容:

pix[[[[1.0,1.0,0.0],[0.0,0.0,0.0],[1.0,0.0,0.0],[1.0,1.0,1.0],[0.0,0.0,0.0],,[[[1.0.0,1.0,1.0],[0.0,0.0,0.0],[1.0.0,1.0,1.0,1.0[[0.0,0.0,0.0],,[[1.0 0,1.0.0,0.0],[[1.0.0,1.0,1.0,1.0],[0.0.0,0.0,0.0.0],[[1.0],[0.0,0.0,0.0]]

好吧,你不应该混淆客户端内存中图像数据的格式和纹理的内部格式。在您的例子中,使用3作为internalFormat参数,这是GL_RGB的一个不推荐使用的快捷方式,实际上意味着每个通道8位的RGB数据。在

当您使用GL_INT作为客户机格式时,GL将将数据转换为内部格式。在本例中,它将您的数据解释为标准化的整数,因此INT_MAX(大约20亿左右)将映射到1.0。由于您只使用最多255个数字,因此在内部纹理格式中这些数字最终将为零,因此您的纹理实际上是黑色的。在

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

相关问题 更多 >