OpenGL 3.1环境下PyOpenGL窗口黑屏问题求助
解决PyOpenGL修复后仍黑屏的问题
嘿,你已经搞定了颜色和顶点类型的两个小问题,但还是黑屏?这其实是PyOpenGL新手很容易踩的坐标映射坑——默认的OpenGL坐标系和你用的像素坐标不匹配,导致你画的四边形根本不在可见范围内!
问题根源
GLUT默认的OpenGL上下文用的是规范化设备坐标系(NDC),范围是[-1, 1],但你现在画的是100.0到200.0的像素坐标,这些坐标完全超出了默认的可见区域,所以屏幕自然是黑的。
解决方案:设置正交投影
我们只需要添加几行代码,把窗口的像素坐标映射到OpenGL的可见空间里就行。具体要做这两步:
- 在显示函数中切换到投影矩阵模式,用
glOrtho定义和窗口尺寸匹配的正交投影 - 确保矩阵栈的切换和重置正确
另外,我还加了清除颜色的设置,让红色四边形更显眼,方便你确认效果。
修改后的完整代码
import OpenGL from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * import io print("Imports successful!") w, h = 500,500 def poly_shape(): glBegin(GL_QUADS) glColor4f(1.0,0.0,0.0,1.0) glVertex2f(100.0, 100.0) glVertex2f(200.0, 100.0) glVertex2f(200.0, 200.0) glVertex2f(100.0, 200.0) glEnd() def showScreen(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 切换到投影矩阵模式,重置并设置正交投影 glMatrixMode(GL_PROJECTION) glLoadIdentity() # 左、右、下、上、近裁剪面、远裁剪面,完全匹配窗口像素坐标 glOrtho(0, w, 0, h, -1, 1) # 切回模型视图矩阵,准备绘制 glMatrixMode(GL_MODELVIEW) glLoadIdentity() poly_shape() glutSwapBuffers() # 初始化部分 glutInit() glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE) glutInitWindowSize(w, h) glutInitWindowPosition(0, 0) wind = glutCreateWindow("OpenGL Coding Practice") # 设置清除颜色为白色,和红色四边形形成对比 glClearColor(1.0, 1.0, 1.0, 1.0) glutDisplayFunc(showScreen) glutIdleFunc(showScreen) glutMainLoop()
关键修改说明
glOrtho(0, w, 0, h, -1, 1):这行是核心,它把窗口的左下角设为坐标原点(0,0),右上角设为(w,h),这样你用像素坐标绘制的图形就能准确显示在窗口里了。- 矩阵模式切换:必须先修改投影矩阵,再切回模型视图矩阵,不然矩阵栈会混乱,导致绘制出错。
glClearColor:虽然不是必须,但白色背景下红色正方形会立刻显现,帮你快速确认问题是否解决。
现在运行代码,就能看到窗口里的红色正方形啦!
内容的提问来源于stack exchange,提问作者srt111
相关产品推荐
相关产品推荐

