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

时间:2020-02-12 20:34:29

标签: glsl shader

我是GLSL的新手,我一直在努力寻找一种方法来用不同的颜色为立方体的所有顶点着色。每个面都有4个顶点,一个立方体有6个面,所以6 * 4 =24。但是我只能在每个角上绘制1种颜色。

顶点着色器:

#version 330

uniform mat4 u_m_matrix;
uniform mat4 u_vp_matrix;

layout (location=0) in vec3 a_position;
layout (location=1) in vec3 a_normal;

out vec3 normal;

void main()
{
    normal = a_position;
    gl_Position = u_vp_matrix * u_m_matrix * vec4(a_position, 1.0);
}

片段着色器:

#version 330

in vec3 normal;

out vec4 fragColor;

void main() {

    fragColor = vec4(normal, 1.0);
 }

结果:

1 个答案:

答案 0 :(得分:3)

如果要为每个面着色为不同的颜色,并希望找到着色器内解决方案,则可能是对立方体的碎片着色,具体取决于顶点坐标的分量最大。

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

#version 330

uniform mat4 u_m_matrix;
uniform mat4 u_vp_matrix;

layout (location=0) in vec3 a_position;
//layout (location=1) in vec3 a_normal;

out vec3 vertPos;

void main()
{
    vertPos     = a_position;
    gl_Position = u_vp_matrix * u_m_matrix * vec4(a_position, 1.0);
}

找到具有最大绝对值的顶点坐标的分量,然后选择一种颜色:

#version 330

in vec3 vertPos;

out vec4 fragColor;

void main() {

    vec3 posAbs  = abs(vertPos);
    vec3 color   = step(posAbs.yzx, posAbs) * step(posAbs.zxy, posAbs); 
    color       += (1.0 - step(color.zxy * vertPos.zxy, vec3(0.0)));

    fragColor = vec4(color, 1.0);
}


如果法线向量是人脸法线,那么使用法线向量还有一个更简单的解决方案:

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

#version 330

uniform mat4 u_m_matrix;
uniform mat4 u_vp_matrix;

layout (location=0) in vec3 a_position;
layout (location=1) in vec3 a_normal;

out vec3 normal;

void main()
{
    normal      = a_normal;
    gl_Position = u_vp_matrix * u_m_matrix * vec4(a_position, 1.0);
}

根据法线向量计算颜色:

#version 330

in vec3 normal;

out vec4 fragColor;

void main() {

    vec3 color = abs(normal.xyz) + max(normal.zxy, 0.0);
    fragColor  = vec4(color, 1.0);
}

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

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

#version 330

in vec3 vertPos;

out vec4 fragColor;

void main() {

    vec3 posAbs = abs(vertPos);
    vec3 color  = (step(posAbs.yzx, posAbs) * step(posAbs.zxy, posAbs) +
                   step(0.0, vertPos.yzx)) * 0.5;
    fragColor   = vec4(color, 1.0);
}

相关问题