0

我正在尝试编写一个着色器来提供 3d 场景的基本照明,以便对对象上的面进行不同的照明。

目标

这似乎是通过简单的全局照明来完成的。我尝试使用片段着色器(SPIRV)复制它,如下所示:

#version 450


layout(set = 0, binding = 3) uniform sc
{
    vec4 surfaceColor;
};

layout(set = 0, binding = 4) uniform cp
{
    vec3 CameraPosition;
};

layout(location = 0) in vec3 Position_WorldSpace;


layout(location = 0) out vec4 _outputColor_;

vec4 WithAlpha(vec4 baseColor, float alpha)
{
    return vec4(baseColor.xyz, alpha);
}

void main()
{
    vec4 LightColor = vec4(.5f, .5f, .5f, 1.f);

    vec4 directionalSpecColor = vec4(0, 0, 0, 0);
    vec3 vertexToEye = normalize(Position_WorldSpace - CameraPosition);
    vec3 lightReflect = normalize(CameraPosition);
    float specularFactor = dot(vertexToEye, lightReflect);
    if (specularFactor > 0)
    {
        specularFactor = pow(abs(specularFactor), 2.f);
        directionalSpecColor = vec4(LightColor.xyz * specularFactor, 1.0f);
    }

   
    _outputColor_ = WithAlpha(clamp(directionalSpecColor + surfaceColor, 0, 1), 1.f);
}

结果:我的着色器结果(大的白色斑点和蓝色背景)

所以有几件事。

  1. 我的数学显然不正确,它只是加法,实际上不会导致脸变黑。
  2. 性能很差。

我可以为每个三角形分配不同的颜色,但这需要我重新处理我的顶点和索引缓冲区以获得一致的外观,并且仍然适用于单个三角形而不是整个面。

有什么建议可以实现这种简单的外观吗?

4

0 回答 0