Glsl 如何以不同的颜色绘制立方体每个面的每个角?

Glsl 如何以不同的颜色绘制立方体每个面的每个角?,glsl,shader,Glsl,Shader,我是GLSL的新手,我一直在努力寻找一种方法,用不同的颜色给立方体的所有顶点着色。每个面有4个顶点,立方体有6个面,因此6*4=24。但我每个角只能画一种颜色 顶点着色器: #版本330 均匀mat4矩阵; 一致mat4u_-vp_矩阵; vec3 a_位置的布局(位置=0); vec3 a_normal中的布局(位置=1); vec3正常; void main() { 正常=a_位置; gl_位置=u_vp_矩阵*u_m_矩阵*vec4(a_位置,1.0); } 片段着色器: #版本330

我是GLSL的新手,我一直在努力寻找一种方法,用不同的颜色给立方体的所有顶点着色。每个面有4个顶点,立方体有6个面,因此6*4=24。但我每个角只能画一种颜色

顶点着色器:

#版本330
均匀mat4矩阵;
一致mat4u_-vp_矩阵;
vec3 a_位置的布局(位置=0);
vec3 a_normal中的布局(位置=1);
vec3正常;
void main()
{
正常=a_位置;
gl_位置=u_vp_矩阵*u_m_矩阵*vec4(a_位置,1.0);
}
片段着色器:

#版本330
vec3正常;
out vec4 fragColor;
void main(){
fragColor=vec4(正常,1.0);
}
结果:


如果要以不同的颜色为每个面上色,并且要在着色器中找到解决方案,则可能需要根据顶点坐标的分量,以最大数量为立方体的碎片上色

将顶点坐标传递给片段着色器:

#版本330
均匀mat4矩阵;
一致mat4u_-vp_矩阵;
vec3 a_位置的布局(位置=0);
//vec3 a_normal中的布局(位置=1);
输出vec3垂直位;
void main()
{
垂直位置=a_位置;
gl_位置=u_vp_矩阵*u_m_矩阵*vec4(a_位置,1.0);
}
找到具有最大绝对值的顶点坐标分量,并选择颜色:

#版本330
在vec3垂直位;
out vec4 fragColor;
void main(){
vec3 posAbs=abs(垂直位置);
vec3颜色=阶跃(posAbs.yzx,posAbs)*阶跃(posAbs.zxy,posAbs);
颜色+=(1.0阶跃(color.zxy*vertPos.zxy,vec3(0.0));
fragColor=vec4(颜色,1.0);
}


如果法向量是面法线,则使用法向量还有更简单的解决方案:

将法向量传递给片段着色器:

#版本330
均匀mat4矩阵;
一致mat4u_-vp_矩阵;
vec3 a_位置的布局(位置=0);
vec3 a_normal中的布局(位置=1);
vec3正常;
void main()
{
正常=正常;
gl_位置=u_vp_矩阵*u_m_矩阵*vec4(a_位置,1.0);
}
根据法向量计算颜色:

#版本330
vec3正常;
out vec4 fragColor;
void main(){
vec3颜色=绝对值(正常.xyz)+最大值(正常.zxy,0.0);
fragColor=vec4(颜色,1.0);
}

[…]所以我需要24种颜色。[……]

在这种情况下,我建议以下解决方案

#版本330
在vec3垂直位;
out vec4 fragColor;
void main(){
vec3 posAbs=abs(垂直位置);
vec3颜色=(步骤(posAbs.yzx,posAbs)*步骤(posAbs.zxy,posAbs)+
步骤(0.0,垂直位置yzx))*0.5;
fragColor=vec4(颜色,1.0);
}

你必须更具体一些。你想要实现什么?“如何以不同的颜色绘制立方体的所有顶点?”-顶点位于立方体的拐角处。所有的角落都有不同的颜色,不是吗?我需要用不同的颜色来画所有的细节。每个面有4个垂直面,因此4*6=24种颜色。每个面有4个顶点(正确!),立方体有6个面(再次正确!),因此6*4=24。(现在让我阻止你,一个立方体有8个顶点,每个面与另一个面共享2个顶点)@jalsh在任何封闭模型中,每个面与另一个面共享每个顶点。坦率地说,这24个数字是从哪里来的?立方体有八个不同的顶点。你的样本图像已经绘制了不同颜色的每一个。我需要颜色echar角落与4种不同的颜色,所以我需要24种颜色。对不起,如果我解释不正确:/@Andre请看答案的最后一部分,我现在已经添加了这一部分。非常感谢!这个答案非常有用!如何在顶点解决方案中实现它?我只需要在顶点着色器上计算它并将其传递给片段着色器?多谢各位@Rabbid76@Andre遗憾的是,这在顶点着色器中不起作用,因为对于所有顶点坐标,顶点的所有组件的数量都是1(至少相同)。片段着色器中的技巧是
vertPos
的组件数量不相等,除了在角点或边上,但可以忽略不计。无论如何,计算是不昂贵的,可以很容易地完成每个片段。哦,好的,我明白了。非常感谢您花时间回答。你帮了我很多