我正在尝试编写一个着色器来提供 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);
}
所以有几件事。
- 我的数学显然不正确,它只是加法,实际上不会导致脸变黑。
- 性能很差。
我可以为每个三角形分配不同的颜色,但这需要我重新处理我的顶点和索引缓冲区以获得一致的外观,并且仍然适用于单个三角形而不是整个面。
有什么建议可以实现这种简单的外观吗?