You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:01:09