You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.5 KiB
GLSL
60 lines
1.5 KiB
GLSL
#version 450
|
|
#extension GL_ARB_separate_shader_objects : enable
|
|
#extension GL_ARB_shading_language_420pack : enable
|
|
|
|
|
|
// In vulkan is possible separate uniform blocks... also if there is no differences (in this case) with new GPUs:
|
|
// e.g. with RTX3080 & 5xx drivers minBlockSize = 512 byte
|
|
// ... only on "very old" AMD RX580 minBlockSize was 80 byte
|
|
#ifdef VULKAN_BUILD
|
|
layout (std140, binding = 1) uniform uBuffer
|
|
{
|
|
vec4 lightPos;
|
|
vec4 PoV;
|
|
} u;
|
|
#else
|
|
layout (std140, binding = 0) uniform uBuffer
|
|
{
|
|
mat4 pMat;
|
|
mat4 vMat;
|
|
mat4 mMat;
|
|
mat4 cMat;
|
|
mat4 lMat;
|
|
vec3 lightPos;
|
|
vec3 PoV;
|
|
} u;
|
|
#endif
|
|
|
|
layout (location = 0) in vsOut {
|
|
vec4 vsColor;
|
|
vec4 vsNormal;
|
|
vec4 vsPos;
|
|
float shininessExp;
|
|
};
|
|
|
|
layout (location = 0) out vec4 outColor;
|
|
|
|
const float ambientInt = 0.25;
|
|
const float specularInt = 1.;
|
|
|
|
#define USE_BLINN_PHONG
|
|
|
|
void main()
|
|
{
|
|
vec3 V = normalize(u.PoV.xyz + vsPos.xyz);
|
|
vec3 L = normalize(u.lightPos.xyz - vsPos.xyz);
|
|
vec3 N = normalize(vsNormal.xyz);
|
|
|
|
#ifdef USE_BLINN_PHONG
|
|
vec3 H = normalize(L - V); // Half(angle)Vec
|
|
float specular = pow(max(0.0, dot(H, N)), shininessExp);
|
|
#else // Phong
|
|
vec3 R = reflect(L, N);
|
|
float specular = pow(max(0.0, dot(R, V)), shininessExp);
|
|
#endif
|
|
float diffuse = max(0.0, dot(N, L))*2.0;
|
|
outColor = vec4(vsColor.rgb * (ambientInt + diffuse) + vec3(specular * specularInt), 1.0);
|
|
outColor = min(vec4(1.0), outColor);
|
|
|
|
}
|