78 lines
No EOL
2.3 KiB
GLSL
78 lines
No EOL
2.3 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 = 5) in mat4 viewMatrix;
|
|
|
|
layout(location = 0) out vec4 outAlbedo;
|
|
layout(location = 1) out vec4 outViewPos;
|
|
|
|
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 = 2, binding = 0) readonly buffer MaterialUniform{
|
|
Material materials[];
|
|
} matUniform;
|
|
|
|
layout(set = 3, binding = 0) uniform sampler2D textSampler[MAX_TEXTURES];
|
|
|
|
layout(push_constant) uniform pc{
|
|
layout(offset = 64) uint materialIdx;
|
|
} push_constants;
|
|
|
|
void main()
|
|
{
|
|
vec4 viewPos = vec4(viewMatrix * inPos);
|
|
outViewPos = viewPos;
|
|
|
|
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);
|
|
return;
|
|
}
|
|
if(material.hasTexture == 1){
|
|
vec4 texColor = texture(textSampler[material.textureIdx],inTextCoords);
|
|
outAlbedo = texColor;
|
|
} else{
|
|
outAlbedo = material.diffuseColor;
|
|
}
|
|
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);
|
|
}
|
|
float opacityf = Opacity.x + Opacity.y + Opacity.z;
|
|
opacityf = opacityf/3;
|
|
if(opacityf < 0.9){discard;}
|
|
|
|
outAlbedo = vec4(outAlbedo.rgb, opacityf);
|
|
} |