使用JOGL绘制多色三角形条带时出现渐变问题求助
解决JOGL中三角形条带颜色渐变问题
你遇到的问题根源在于GL_TRIANGLE_STRIP的颜色插值机制:OpenGL会自动在相邻顶点的颜色之间进行平滑插值,所以当你在条带中间切换颜色时,相邻三角形的顶点颜色不同,就会产生渐变效果。要实现每个三角形纯色且边缘清晰,你需要让每个三角形的三个顶点都使用同一颜色,或者通过重复顶点来中断条带的插值链。
下面提供两种可行的解决方案:
方案1:改用GL_TRIANGLES绘制
直接使用GL_TRIANGLES替代GL_TRIANGLE_STRIP,为每个三角形的三个顶点都设置对应颜色,这样每个三角形的颜色完全独立,不会产生插值:
Position drawPos = begPos.copy().offsetX(A); gl.glBegin(GL.GL_TRIANGLES); // 第一个红色三角形 gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); Position p1 = drawPos.copy().offsetX(-A); gl.glVertex3f(p1.getX(), p1.getY(), 0f); Position p2 = p1.copy().offset2DAngle(-60f, A); gl.glVertex3f(p2.getX(), p2.getY(), 0f); // 第二个黄色三角形 gl.glColor3f(1.0f, 1.0f, 0.0f); gl.glVertex3f(p2.getX(), p2.getY(), 0f); Position p3 = p2.copy().offsetX(-A); gl.glVertex3f(p3.getX(), p3.getY(), 0f); Position p4 = p3.copy().offset2DAngle(-60f, A); gl.glVertex3f(p4.getX(), p4.getY(), 0f); // 第三个红色三角形 gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(p4.getX(), p4.getY(), 0f); Position p5 = p4.copy().offsetX(-A); gl.glVertex3f(p5.getX(), p5.getY(), 0f); Position p6 = p5.copy().offset2DAngle(-60f, A); gl.glVertex3f(p6.getX(), p6.getY(), 0f); // 第四个黄色三角形 gl.glColor3f(1.0f, 1.0f, 0.0f); gl.glVertex3f(p6.getX(), p6.getY(), 0f); Position p7 = p6.copy().offsetX(-A); gl.glVertex3f(p7.getX(), p7.getY(), 0f); // 根据你的原始绘图逻辑补充第三个顶点坐标 gl.glVertex3f(/* 对应顶点坐标 */); gl.glEnd();
方案2:在GL_TRIANGLE_STRIP中重复顶点中断插值
如果你坚持使用GL_TRIANGLE_STRIP,可以通过重复上一个顶点的方式,插入一个“无效”的三角形(两个顶点相同,OpenGL会跳过它),这样就能分隔不同颜色的三角形,避免颜色插值:
Position drawPos = begPos.copy().offsetX(A); gl.glBegin(GL.GL_TRIANGLE_STRIP); // 第一个红色三角形的三个顶点 gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); drawPos.offsetX(-A); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); drawPos.offset2DAngle(-60f, A); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); // 重复最后一个顶点,中断插值,切换黄色 gl.glColor3f(1.0f, 1.0f, 0.0f); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); // 重复顶点 drawPos.offsetX(-A); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); drawPos.offset2DAngle(-60f, A); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); // 重复最后一个顶点,中断插值,切换红色 gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); // 重复顶点 drawPos.offsetX(-A); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); drawPos.offset2DAngle(-60f, A); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); // 重复最后一个顶点,中断插值,切换黄色 gl.glColor3f(1.0f, 1.0f, 0.0f); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); // 重复顶点 drawPos.offsetX(-A); gl.glVertex3f(drawPos.getX(), drawPos.getY(), 0f); gl.glEnd();
原理说明:当连续两个顶点完全相同时,OpenGL在绘制三角形条带时会忽略这个无效的三角形,同时后续的颜色插值会从重复的顶点重新开始,这样每个三角形的三个顶点都能保持同一颜色,不会和前一个三角形产生渐变。
内容的提问来源于stack exchange,提问作者StreakerOne
相关产品推荐
相关产品推荐

