138 lines
No EOL
4.6 KiB
GLSL
138 lines
No EOL
4.6 KiB
GLSL
#version 450
|
|
|
|
const int MAX_TEXTURES = 512;
|
|
|
|
layout(location = 0) in vec4 inPos;
|
|
layout(location = 1) in vec3 inNormal;
|
|
layout(location = 2) in vec3 inTangent;
|
|
layout(location = 3) in vec3 inBitangent;
|
|
layout(location = 4) in vec2 inTextCoords;
|
|
|
|
layout(location = 1) out vec4 outAlbedo ;
|
|
layout(location = 0) out vec4 outPos;
|
|
layout(location = 2) out vec4 outNormal;
|
|
layout(location = 3) out vec4 outPBR;
|
|
layout(location = 4) out vec4 outEmissive;
|
|
layout(location = 5) out vec4 outTranslucency;
|
|
layout(location = 6) out vec4 outOpacity;
|
|
|
|
const float bayerMatrix[16] = float[](
|
|
0.0 / 16.0, 8.0 / 16.0, 2.0 / 16.0, 10.0 / 16.0,
|
|
12.0 / 16.0, 4.0 / 16.0, 14.0 / 16.0, 6.0 / 16.0,
|
|
3.0 / 16.0, 11.0 / 16.0, 1.0 / 16.0, 9.0 / 16.0,
|
|
15.0 / 16.0, 7.0 / 16.0, 13.0 / 16.0, 5.0 / 16.0
|
|
);
|
|
|
|
struct Material {
|
|
vec4 diffuseColor; //16
|
|
uint hasTexture; //20
|
|
uint textureIdx; //24
|
|
uint hasNormalMap; //28
|
|
uint normalMapIdx; //32
|
|
uint hasRoughMap; //36
|
|
uint roughMapIdx; //40
|
|
float roughnessFactor; //44
|
|
float metallicFactor; //48
|
|
vec4 emissiveColour; //64
|
|
uint hasEmissiveMap; //68
|
|
uint emissiveMapIdx; //72
|
|
uint hasTranslucencyMap; //76
|
|
uint translucencyMapIdx; //80
|
|
float translucencyFactor; //84
|
|
uint hasOpacityMap; //88
|
|
uint OpacityMapIdx; //92
|
|
float OpacityFactor; //96
|
|
};
|
|
layout(set = 2, binding = 0) readonly buffer MaterialUniform {
|
|
Material materials[];
|
|
} matUniform;
|
|
layout(set = 3, binding = 0) uniform sampler2D textSampler[MAX_TEXTURES];
|
|
|
|
vec3 calcNormal(Material material, vec3 normal, vec2 textCoords, mat3 TBN)
|
|
{
|
|
vec3 newNormal = normal;
|
|
if (material.hasNormalMap > 0)
|
|
{
|
|
newNormal = texture(textSampler[material.normalMapIdx], textCoords).rgb;
|
|
newNormal = normalize(newNormal * 2.0 - 1.0);
|
|
newNormal = normalize(TBN * newNormal);
|
|
}
|
|
return newNormal;
|
|
}
|
|
|
|
layout(push_constant) uniform pc {
|
|
layout(offset = 64) uint materialIdx;
|
|
} push_constants;
|
|
|
|
void main()
|
|
{
|
|
outPos = inPos;
|
|
|
|
Material material = matUniform.materials[push_constants.materialIdx];
|
|
int textureIndex = int(material.textureIdx);
|
|
if (textureIndex >= MAX_TEXTURES){
|
|
outAlbedo = vec4(0.0,0.0,1.0,1.0);
|
|
outOpacity = vec4(0.0,0.0,1.0,1.0);
|
|
outNormal = vec4(0.0,0.0,1.0,1.0);
|
|
outEmissive = vec4(0.0,0.0,1.0,1.0);
|
|
outTranslucency = vec4(0.0,0.0,1.0,1.0);
|
|
outPBR = vec4(0.0,0.0,1.0,1.0);
|
|
return;
|
|
}
|
|
if (material.hasTexture == 1) {
|
|
outAlbedo = texture(textSampler[material.textureIdx], inTextCoords);
|
|
} else {
|
|
outAlbedo = material.diffuseColor;
|
|
}
|
|
/*int Intensity = 4;
|
|
int x = int(gl_FragCoord.x) % Intensity;
|
|
int y = int(gl_FragCoord.y) % Intensity;
|
|
float threshold = bayerMatrix[y * Intensity + x];
|
|
if(outAlbedo.a < threshold || outAlbedo.a < 0.05f) discard;*/
|
|
|
|
vec4 Opacity = vec4(outAlbedo.a,outAlbedo.a,outAlbedo.a,1);
|
|
if(material.OpacityFactor != 1) Opacity = vec4(material.OpacityFactor, material.OpacityFactor, material.OpacityFactor, 1);
|
|
if(material.hasOpacityMap > 0 && material.OpacityMapIdx < MAX_TEXTURES){
|
|
Opacity = texture(textSampler[material.OpacityMapIdx], inTextCoords);
|
|
}
|
|
outOpacity = Opacity;
|
|
|
|
float opacityf = Opacity.x + Opacity.y + Opacity.z;
|
|
opacityf = opacityf/3;
|
|
|
|
outAlbedo = vec4(outAlbedo.rgb, opacityf);
|
|
|
|
if(outAlbedo.a < 0.75) discard;
|
|
|
|
|
|
mat3 TBN = mat3(inTangent, inBitangent, inNormal);
|
|
vec3 newNormal = calcNormal(material, inNormal, inTextCoords, TBN);
|
|
outNormal = vec4(newNormal, outAlbedo.a);
|
|
|
|
float ao = 0.5f;
|
|
float roughnessFactor = 0.0f;
|
|
float metallicFactor = 0.0f;
|
|
if (material.hasRoughMap > 0) {
|
|
vec4 metRoughValue = texture(textSampler[material.roughMapIdx], inTextCoords);
|
|
roughnessFactor = metRoughValue.g;
|
|
metallicFactor = metRoughValue.b;
|
|
} else {
|
|
roughnessFactor = material.roughnessFactor;
|
|
metallicFactor = material.metallicFactor;
|
|
}
|
|
|
|
vec4 emissive = material.emissiveColour;
|
|
if (material.hasEmissiveMap > 0 && material.emissiveMapIdx < MAX_TEXTURES) {
|
|
emissive = texture(textSampler[material.emissiveMapIdx], inTextCoords);
|
|
}
|
|
outEmissive = emissive;
|
|
|
|
vec4 Translucency = vec4(material.translucencyFactor,material.translucencyFactor,material.translucencyFactor,1);
|
|
if(material.hasTranslucencyMap > 0 && material.translucencyMapIdx < MAX_TEXTURES){
|
|
Translucency = texture(textSampler[material.translucencyMapIdx], inTextCoords);
|
|
}
|
|
outTranslucency = Translucency;
|
|
|
|
outPBR = vec4(ao, roughnessFactor, metallicFactor, outAlbedo.a);
|
|
|
|
} |