OpenGL如何为物体每个面设置独立颜色?金字塔着色问题排查
OpenGL金字塔多色渲染错误排查
问题代码
我是OpenGL完全新手,尝试为金字塔的每个面设置不同颜色,编写的实现代码如下:
glBegin(GL_POLYGON) f1 = ((1,-1,-1),(1,-1,1),(0,1,0)) f2 = ((1,-1,1),(-1,-1,1),(0,1,0)) f3 = ((-1,-1,-1),(-1,-1,1),(0,1,0)) f4 = ((1,-1,-1),(-1,-1,-1),(0,1,0)) f5 = ((1,-1,-1),(1,-1,1),(-1,-1,-1),(-1,-1,1)) for i in f1: glColor3f(0,255,255) glVertex3fv(i) for i in f2: glColor3f(255,0,0) glVertex3fv(i) for i in f3: glColor3f(0,255,0) glVertex3fv(i) for i in f4: glColor3f(255,255,0) glVertex3fv(i) for i in f5: glColor3f(255,0,255) glVertex3fv(i) glEnd()
最终渲染效果不符合预期,渲染结果如下:
存在的错误
- 图元类型选择错误:使用
GL_POLYGON作为绘制图元时,OpenGL会把glBegin到glEnd之间传入的所有顶点当成单个连续凸多边形处理,不会自动识别代码里拆分的5个独立面,会直接把所有顶点按传入顺序串连生成多边形,自然出现面错乱、穿插的问题。 - 颜色参数取值范围错误:
glColor3f接口接收的颜色分量取值范围是0.0f ~ 1.0f,不是0~255的整数区间。传入255时,对应颜色通道会直接取最大值,根本无法得到预设的青色、纯红、纯绿等颜色。 - 底面顶点绕序不统一:定义的底面f5顶点绕序和四个侧面不一致,后续开启背面剔除功能时,底面会被当作背面直接剔除,提前统一绕序可以避免后续踩坑。
修正方案
根据错误点修改代码即可得到正确效果,参考代码如下:
# 绘制4个三角形侧面 glBegin(GL_TRIANGLES) # 面1:青色 glColor3f(0.0, 1.0, 1.0) for v in ((1,-1,-1),(1,-1,1),(0,1,0)): glVertex3fv(v) # 面2:红色 glColor3f(1.0, 0.0, 0.0) for v in ((1,-1,1),(-1,-1,1),(0,1,0)): glVertex3fv(v) # 面3:绿色 glColor3f(0.0, 1.0, 0.0) for v in ((-1,-1,1),(-1,-1,-1),(0,1,0)): glVertex3fv(v) # 面4:黄色 glColor3f(1.0, 1.0, 0.0) for v in ((-1,-1,-1),(1,-1,-1),(0,1,0)): glVertex3fv(v) glEnd() # 绘制四边形底面 glBegin(GL_QUADS) # 面5:品红色,统一顶点绕序为从外侧观察的逆时针顺序 glColor3f(1.0, 0.0, 1.0) for v in ((1,-1,-1),(1,-1,1),(-1,-1,1),(-1,-1,-1)): glVertex3fv(v) glEnd()
如果不想拆分多次glBegin/glEnd,也可以在同一个glBegin(GL_TRIANGLES)块内,把四边形底面拆成两个三角形传入,最终渲染效果完全一致。
内容的提问来源于stack exchange,提问作者CloudlessStudio
相关产品推荐
相关产品推荐

