Python 带纹理的PyOpenGL球体
我想使用Python-PyOpenGL生成三个球体的场景。侧边有两个颜色(红色和绿色)。中间一个,上面有任何纹理(砖块纹理,实际上是与代码位于同一目录中的方形jpg文件) 到目前为止,我所做的是: 从某种意义上说,由<代码> GL()/<代码>生成的中间球中的纹理具有奇怪的行为。有一些小的绿色三角形,而不是我的纹理文件 这是我的纹理文件: 我尝试将此文件映射为曲面,例如中间球体上的纹理。我不知道问题出在哪里 这是我的代码,我不知道我错过了什么,也不知道在中间球体上获得正确的纹理贴图有什么错:Python 带纹理的PyOpenGL球体,python,opengl,pyopengl,Python,Opengl,Pyopengl,我想使用Python-PyOpenGL生成三个球体的场景。侧边有两个颜色(红色和绿色)。中间一个,上面有任何纹理(砖块纹理,实际上是与代码位于同一目录中的方形jpg文件) 到目前为止,我所做的是: 从某种意义上说,由 GL()/生成的中间球中的纹理具有奇怪的行为。有一些小的绿色三角形,而不是我的纹理文件 这是我的纹理文件: 我尝试将此文件映射为曲面,例如中间球体上的纹理。我不知道问题出在哪里 这是我的代码,我不知道我错过了什么,也不知道在中间球体上获得正确的纹理贴图有什么错: from Op
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
import sys
from PIL import Image as Image
import numpy
name = 'Navigation paradigm'
def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(800, 800)
glutInitWindowPosition(350, 200)
glutCreateWindow(name)
glClearColor(0., 0., 0., 1.)
glShadeModel(GL_SMOOTH)
glEnable(GL_CULL_FACE)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
lightZeroPosition = [10., 4., 10., 1.]
lightZeroColor = [0.8, 1.0, 0.8, 1.0]
glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition)
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor)
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1)
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05)
glEnable(GL_LIGHT0)
glutDisplayFunc(display_scene)
glMatrixMode(GL_PROJECTION)
gluPerspective(40., 1., 1., 40.)
glMatrixMode(GL_MODELVIEW)
gluLookAt(0, 0, 10,
0, 0, 0,
0, 1, 0)
glPushMatrix()
glutMainLoop()
return
def display_scene():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glPushMatrix()
# Textured thing
tex = read_texture('brick.jpg')
qobj = gluNewQuadric()
gluQuadricTexture(qobj, GL_TRUE)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, tex)
glBegin(GL_TRIANGLES)
gluSphere(qobj, 1, 50, 50)
gluDeleteQuadric(qobj)
glDisable(GL_TEXTURE_2D)
# Left sphere
color = [1.0, 0.0, 0.0, 1.0]
glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
glTranslatef(-2, 0, 0)
glutSolidSphere(1, 100, 20)
# Right sphere
color = [0.0, 1.0, 0.0, 1.0]
glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
glTranslatef(4, 0, 0)
glutSolidSphere(1, 100, 20)
glPopMatrix()
glutSwapBuffers()
return
def read_texture(filename):
img = Image.open(filename)
img_data = numpy.array(list(img.getdata()), numpy.int8)
textID = glGenTextures(1)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
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_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, img_data)
return textID
if __name__ == '__main__':
main()
但眼前有一个稍微不同的“问题”。所以,万一其他人也有同样的问题,我会回答的。
首先,如注释中所述,您不需要调用glBegin()
。因为gluSphere()。此外,如果要调用glBegin()
,还需要调用glEnd()
。所以你看到一些东西的原因,基本上是因为你把你的司机弄糊涂了,然后它做了一些不该做的事情
在read_texture()
中,生成纹理名称后,不绑定它。因此,后续与纹理相关的调用将指向默认纹理,而不是新创建的纹理
textID = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, textID) # This is what's missing
添加缺少的glBindTexture()
调用后,将得到如下结果
现在它可能看起来有点奇怪,可能看起来有点不对劲。但事实是,一切都正常运转。问题在于纹理本身
“问题”在于砖纹理不是球形贴图纹理。如果我们现在只使用球形贴图纹理替换砖块纹理,那么我们将得到以下结果
下面是上面使用的球形贴图纹理:
那是干什么的glBegin()
根本不起作用。如果不使用该选项,则渲染带有纯色的中间球体。使用glBegin()可以在球体上至少进行三次尝试。如果我想绑定两个具有不同纹理的球,我需要一次又一次地加载img吗,或者我有办法切换这些绑定纹理吗