编写具有每个三角形/面的纯色的GLSL片段着色器的方法

Man*_*ius 5 opengl 3d shader glsl

我有顶点和三角形数据,其中包含每个三角形(面)的颜色,而不是每个顶点的颜色.即单个顶点由多个面共享,每个面可能具有不同的颜色.

我应该如何在GLSL中解决这个问题,以便为每个正在渲染的面部获得纯色分配?通过平均顶点相邻多边形的颜色来计算和分配"顶点颜色"缓冲区很容易,但这当然会产生模糊结果,其中颜色在片段着色器中进行插值.

我真正需要的不应该是插值颜色值,一旦按预期工作,我将有大约40k个三角形阴影,大约15种可能的纯色.

sta*_*ole 6

虽然您可以在高端GLSL中执行此操作,但实现实体着色的正确方法是为每个三角形创建唯一的顶点.这是一个微不足道的循环.对于每个顶点,计算共享多少个三角形.这就是你经常复制它的频率.确保你的循环是O(n).然后将每个顶点颜色或法线设置为三角形的颜色或法线.再一次直接循环.不要费心优化共享颜色,这是不值得的.

稍后编辑,因为这是一个流行的答案:

要按平面着色进行平坦,可以在世界或视图空间中插入顶点位置.然后在片段着色器中计算此变量的ddx(dFdx)和ddy(dFdy).取这两个向量的交叉积并将其标准化 - 你得到平坦的正常!根本不需要网格更改或每个顶点数据.