81 lines
No EOL
2.4 KiB
GLSL
81 lines
No EOL
2.4 KiB
GLSL
#version 450
|
|
|
|
// Keep in sync manually with Java code
|
|
const int MAX_TEXTURES = 128;
|
|
|
|
layout (location = 0) in vec2 inTextCoords;
|
|
layout (location = 1) in flat uint inMaterialIdx;
|
|
|
|
layout(location = 0) out vec2 outFragColor;
|
|
|
|
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
|
|
float reflectiveness; //100
|
|
float refractiveness; //104
|
|
float Padding1; //108
|
|
float Padding2; //112
|
|
};
|
|
layout(set = 1, binding = 0) uniform sampler2D textSampler[MAX_TEXTURES];
|
|
layout(set = 2, binding = 0) readonly buffer MaterialUniform {
|
|
Material materials[];
|
|
} matUniform;
|
|
|
|
void main()
|
|
{
|
|
|
|
Material material = matUniform.materials[inMaterialIdx];
|
|
|
|
float Refractiveness = material.refractiveness;
|
|
float Reflectiveness = material.reflectiveness;
|
|
float Translucency = material.translucencyFactor;
|
|
float Opacity = material.OpacityFactor;
|
|
if(material.hasTranslucencyMap > 0){
|
|
vec4 translucencyMap = texture(textSampler[material.translucencyMapIdx], inTextCoords);
|
|
Translucency = (translucencyMap.x + translucencyMap.y + translucencyMap.z)/3.0;
|
|
}
|
|
if(material.hasOpacityMap > 0){
|
|
vec4 opacityMap = texture(textSampler[material.OpacityMapIdx], inTextCoords);
|
|
Opacity = (opacityMap.x + opacityMap.y + opacityMap.z)/3.0;
|
|
}
|
|
int textureIndex = int(material.textureIdx);
|
|
if (textureIndex >= MAX_TEXTURES){
|
|
outFragColor = vec2(0.0,0.0);
|
|
return;
|
|
}
|
|
vec4 albedo;
|
|
if (material.hasTexture == 1) {
|
|
albedo = texture(textSampler[material.textureIdx], inTextCoords);
|
|
} else {
|
|
albedo = material.diffuseColor;
|
|
}
|
|
if (albedo.a < 0.5 || Translucency > 0.5 || Opacity < 0.5) {
|
|
discard;
|
|
}
|
|
|
|
float depth = gl_FragCoord.z;
|
|
float moment1 = depth;
|
|
float moment2 = depth * depth;
|
|
|
|
float dx = dFdx(depth);
|
|
float dy = dFdy(depth);
|
|
moment2 += 0.25 * (dx * dx + dy * dy);
|
|
|
|
outFragColor = vec2(moment1, moment2);
|
|
} |