我想要达到的效果是具有清晰轮廓的顶点颜色。因此,在三角形内部,片段着色器应使用最接近该片段的任何顶点的颜色。
现在在考虑它时,我能想出的唯一解决方案是将tex coords 1,0,0 0,1,0和0,0,1分配给三个顶点,并且有两个(重新排序的)副本。顶点颜色数组,然后从相应的tex坐标最高的颜色aray中选择。此方法至少会为每个顶点添加9个浮点数。这将减慢应用程序的速度,因为我的网格经常变化退出并显着增加内存占用。
是否有更好/更简单的方法来实现这一目标?
答案 0 :(得分:1)
[替换了错误的原始]
这应该实际上工作......
//vert
out vec3 colour;
...
//geom
//simple passthrough but dupe colours to separate and include barycentric coord
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
in vec3 colour[];
flat out vec3 colours[3];
out vec3 coord;
...
for (int i = 0; i < 3; ++i)
colours[i] = colour[i];
for (int i = 0; i < 3; ++i)
{
coord = vec3(0.0);
coord[i] = 1.0;
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
//frag
flat in vec3 colours[3]; //triangle's 3 vertex colours
in vec3 coord; //barycentric weights as a result of interp
...
//get index of biggest coord
int i = (coord.x > cood.y && coord.x > coord.z) ? 0 :
((coord.y > coord.z) ? 1 : 2);
//choose that colour
vec3 fragColour = colours[i];