engine/assets/shaders/z_prepass.glsl
2024-08-24 23:26:01 +04:00

79 lines
1.6 KiB
GLSL

#extension GL_ARB_bindless_texture : enable
struct DrawCmdData {
mat4 transform;
int materialIdx;
};
// UBOs
layout(std140, binding = 0) uniform Matrices {
mat4 projection;
mat4 view;
};
layout(std430, binding = 3) readonly buffer DrawCmdDatas {
// Access by gl_DrawID
DrawCmdData draw_data[];
};
VERTEX_EXPORT flat uint DrawID;
VERTEX_EXPORT VertexData {
vec2 uv;
} VertexOut;
#if VERTEX_SHADER
layout(location = 0) in vec3 aPos;
layout(location = 2) in vec2 aUV;
void main() {
DrawID = gl_BaseInstance + gl_InstanceID;
mat4 model = draw_data[DrawID].transform;
mat4 viewModel = view * model;
vec4 vPos = viewModel * vec4(aPos.xyz, 1.0);
gl_Position = projection * vPos;
VertexOut.uv = aUV;
}
#endif
#if FRAGMENT_SHADER
struct Material {
vec4 albedo;
sampler2D albedo_map;
vec2 albedo_map_uv_scale;
sampler2D normal_map;
vec2 normal_map_uv_scale;
float metallic;
sampler2D metallic_map;
vec2 metallic_map_uv_scale;
float roughness;
sampler2D roughness_map;
vec2 roughness_map_uv_scale;
vec3 emission;
sampler2D emission_map;
vec2 emission_map_uv_scale;
};
layout(std430, binding = 2) readonly buffer Materials {
uint materials_count;
Material materials[];
};
vec4 getAlbedo(int materialIdx) {
return textureSize(materials[materialIdx].albedo_map, 0) == ivec2(0) ? vec4(pow(materials[materialIdx].albedo.rgb, vec3(2.2)), materials[materialIdx].albedo.a) : texture(materials[materialIdx].albedo_map, VertexOut.uv * materials[materialIdx].albedo_map_uv_scale);
}
out vec4 FragColor;
void main() {
int matIdx = draw_data[DrawID].materialIdx;
if (getAlbedo(matIdx).a < 0.5) {
discard;
}
}
#endif