如何在OpenGL中为I型钢的不同线条设置不同颜色?
解决方案
要实现可见线条绿色、不可见线条粉色,且尽量少修改I_beam()函数,可以利用OpenGL的深度测试和深度掩码机制,仅需少量改动现有代码:
步骤1:微调I_beam()函数
移除函数内部固定的颜色设置,让颜色由外部控制(仅改1行):
def I_beam(): glBegin(GL_LINES) # 移除固定颜色,改为外部传入颜色 for edge in edges: for vertex in edge: glVertex3fv(vertices[vertex]) glEnd()
步骤2:修改main()函数的绘制逻辑
添加深度测试配置,分两次绘制模型实现分层颜色:
def main(): pygame.init() display = (900,600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) glTranslatef(0.0,0.0, -5) # 启用深度测试,让OpenGL自动判断线条遮挡关系 glEnable(GL_DEPTH_TEST) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) # 先画不可见线条(粉色):禁用深度写入,所有粉色线条都会被绘制 glDepthMask(GL_FALSE) glColor3f(1, 0, 1) # 粉色RGB值 I_beam() # 再画可见线条(绿色):启用深度写入,只有未被遮挡的线条会覆盖粉色 glDepthMask(GL_TRUE) glColor3f(0, 1, 0) # 绿色RGB值 I_beam() pygame.display.flip()
原理说明
glDepthMask(GL_FALSE):关闭深度缓冲区写入,此时绘制的粉色线条不会影响深度判断,无论是否被遮挡都会留在画面上glDepthMask(GL_TRUE):恢复深度写入,此时绘制的绿色线条仅在未被其他线条遮挡时(深度测试通过)才会渲染,覆盖下方的粉色线条- 最终效果:可见线条显示绿色,被遮挡的不可见线条保留粉色
这种方式仅修改了I_beam()函数的一行代码,并在main()中添加了几行绘制逻辑,完全满足"尽量少修改现有函数"的需求。
内容的提问来源于stack exchange,提问作者Koty
相关产品推荐
相关产品推荐

