54 lines
1.6 KiB
GLSL
54 lines
1.6 KiB
GLSL
#version 450
|
|
|
|
layout(location = 0) out vec4 fragColor;
|
|
layout(location = 1) out vec4 fragNormal;
|
|
layout(location = 2) out vec4 fragPosition;
|
|
layout(location = 3) out vec4 fragPbr;
|
|
|
|
layout(location = 0) in vec3 inPos;
|
|
layout(location = 1) in vec3 inNormal;
|
|
layout(location = 2) in vec2 inUV;
|
|
layout(location = 3) in mat3 inTBN;
|
|
|
|
layout( push_constant ) uniform constants
|
|
{
|
|
uint transformIdx;
|
|
uint materialIdx;
|
|
} PushConstants;
|
|
|
|
struct Material {
|
|
vec4 albedo;
|
|
vec4 bsdf;
|
|
|
|
int colorTexture;
|
|
float colorTextureBlend;
|
|
|
|
int normalTexture;
|
|
float normalTextureBlend;
|
|
|
|
int pbrTexture;
|
|
float pbrTextureBlend;
|
|
};
|
|
|
|
layout(set = 2, binding = 0) uniform Materials {
|
|
Material materials[128];
|
|
} materials;
|
|
|
|
layout(set = 2, binding = 2) uniform sampler2DArray colorTextures;
|
|
layout(set = 2, binding = 3) uniform sampler2DArray normalTextures;
|
|
layout(set = 2, binding = 4) uniform sampler2DArray pbrTextures;
|
|
|
|
|
|
void main() {
|
|
Material material = materials.materials[PushConstants.materialIdx];
|
|
vec4 color = texture(colorTextures, vec3(inUV, material.colorTexture)).rgba;
|
|
vec3 normal = texture(normalTextures, vec3(inUV, materials.materials[PushConstants.materialIdx].normalTexture)).rgb;
|
|
normal = normalize(normal * 2.0 - 1.0);
|
|
vec2 pbr = texture(pbrTextures, vec3(inUV, material.pbrTexture)).bg;
|
|
|
|
fragColor = vec4(mix(material.albedo.rgb, color.rgb, material.colorTextureBlend), color.a);
|
|
fragNormal = vec4(mix(inNormal, normalize(inTBN * normalize(normal)), 1.0), color.a);
|
|
fragPosition = vec4(inPos, color.a);
|
|
fragPbr = vec4(mix(material.bsdf.xy, pbr, 1.0), 0.0, color.a);
|
|
}
|