79 lines
1.6 KiB
GLSL
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
|