ADD: emissive, occlusion
This commit is contained in:
@@ -11,6 +11,7 @@ layout(location=0) out vec4 outColor;
|
||||
layout(set=1, binding=0) uniform sampler2D posTex;
|
||||
layout(set=1, binding=1) uniform sampler2D normalTex;
|
||||
layout(set=1, binding=2) uniform sampler2D albedoTex;
|
||||
layout(set=1, binding=3) uniform sampler2D extraTex;
|
||||
layout(set=2, binding=0) uniform sampler2D shadowTex[4];
|
||||
// TLAS for ray query (optional, guarded by sceneData.rtOptions.x)
|
||||
#ifdef GL_EXT_ray_query
|
||||
@@ -279,6 +280,10 @@ void main(){
|
||||
vec3 albedo = albedoSample.rgb;
|
||||
float metallic = clamp(albedoSample.a, 0.0, 1.0);
|
||||
|
||||
vec4 extraSample = texture(extraTex, inUV);
|
||||
float ao = extraSample.x;
|
||||
vec3 emissive = extraSample.yzw;
|
||||
|
||||
vec3 camPos = vec3(inverse(sceneData.view)[3]);
|
||||
vec3 V = normalize(camPos - pos);
|
||||
|
||||
@@ -340,7 +345,8 @@ void main(){
|
||||
vec3 specIBL = prefiltered * (F0 * brdf.x + brdf.y);
|
||||
vec3 diffIBL = (1.0 - metallic) * albedo * sh_eval_irradiance(N);
|
||||
|
||||
vec3 color = direct + diffIBL + specIBL;
|
||||
vec3 indirect = diffIBL + specIBL;
|
||||
vec3 color = direct + indirect * ao + emissive;
|
||||
|
||||
outColor = vec4(color, 1.0);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ layout(location=0) out vec4 outColor;
|
||||
layout(set=1, binding=0) uniform sampler2D posTex;
|
||||
layout(set=1, binding=1) uniform sampler2D normalTex;
|
||||
layout(set=1, binding=2) uniform sampler2D albedoTex;
|
||||
layout(set=1, binding=3) uniform sampler2D extraTex;
|
||||
layout(set=2, binding=0) uniform sampler2D shadowTex[4];
|
||||
|
||||
// Tunables for shadow quality and blending
|
||||
@@ -208,6 +209,10 @@ void main(){
|
||||
vec3 albedo = albedoSample.rgb;
|
||||
float metallic = clamp(albedoSample.a, 0.0, 1.0);
|
||||
|
||||
vec4 extraSample = texture(extraTex, inUV);
|
||||
float ao = extraSample.x;
|
||||
vec3 emissive = extraSample.yzw;
|
||||
|
||||
vec3 camPos = vec3(inverse(sceneData.view)[3]);
|
||||
vec3 V = normalize(camPos - pos);
|
||||
|
||||
@@ -235,7 +240,8 @@ void main(){
|
||||
vec3 specIBL = prefiltered * (F0 * brdf.x + brdf.y);
|
||||
vec3 diffIBL = (1.0 - metallic) * albedo * sh_eval_irradiance(N);
|
||||
|
||||
vec3 color = direct + diffIBL + specIBL;
|
||||
vec3 indirect = diffIBL + specIBL;
|
||||
vec3 color = direct + indirect * ao + emissive;
|
||||
|
||||
outColor = vec4(color, 1.0);
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ layout(location = 0) out vec4 outPos;
|
||||
layout(location = 1) out vec4 outNorm;
|
||||
layout(location = 2) out vec4 outAlbedo;
|
||||
layout(location = 3) out uint outObjectID;
|
||||
layout(location = 4) out vec4 outExtra;
|
||||
|
||||
// Keep push constants layout in sync with mesh.vert / GPUDrawPushConstants
|
||||
struct Vertex {
|
||||
@@ -58,5 +59,13 @@ void main() {
|
||||
outPos = vec4(inWorldPos, 1.0);
|
||||
outNorm = vec4(Nw, roughness);
|
||||
outAlbedo = vec4(albedo, metallic);
|
||||
// Extra G-buffer: x = AO, yzw = emissive
|
||||
float aoStrength = clamp(materialData.extra[0].y, 0.0, 1.0);
|
||||
float aoTex = texture(occlusionTex, inUV).r;
|
||||
float ao = 1.0 - aoStrength + aoStrength * aoTex;
|
||||
vec3 emissiveFactor = materialData.extra[1].rgb;
|
||||
vec3 emissiveTex = texture(emissiveTex, inUV).rgb;
|
||||
vec3 emissive = emissiveTex * emissiveFactor;
|
||||
outExtra = vec4(ao, emissive);
|
||||
outObjectID = PushConstants.objectID;
|
||||
}
|
||||
|
||||
@@ -44,4 +44,6 @@ layout(set = 1, binding = 0) uniform GLTFMaterialData{
|
||||
|
||||
layout(set = 1, binding = 1) uniform sampler2D colorTex;
|
||||
layout(set = 1, binding = 2) uniform sampler2D metalRoughTex;
|
||||
layout(set = 1, binding = 3) uniform sampler2D normalMap; // tangent-space normal, UNORM
|
||||
layout(set = 1, binding = 3) uniform sampler2D normalMap; // tangent-space normal, UNORM
|
||||
layout(set = 1, binding = 4) uniform sampler2D occlusionTex; // occlusion (R channel)
|
||||
layout(set = 1, binding = 5) uniform sampler2D emissiveTex; // emissive (RGB, sRGB)
|
||||
|
||||
@@ -61,7 +61,18 @@ void main()
|
||||
vec3 specIBL = prefiltered * (F0 * brdf.x + brdf.y);
|
||||
vec3 diffIBL = (1.0 - metallic) * albedo * sh_eval_irradiance(N);
|
||||
|
||||
vec3 color = direct + diffIBL + specIBL;
|
||||
// Ambient occlusion from texture + strength (indirect only)
|
||||
float aoStrength = clamp(materialData.extra[0].y, 0.0, 1.0);
|
||||
float aoTex = texture(occlusionTex, inUV).r;
|
||||
float ao = 1.0 - aoStrength + aoStrength * aoTex;
|
||||
|
||||
// Emissive from texture and factor
|
||||
vec3 emissiveFactor = materialData.extra[1].rgb;
|
||||
vec3 emissiveTex = texture(emissiveTex, inUV).rgb;
|
||||
vec3 emissive = emissiveTex * emissiveFactor;
|
||||
|
||||
vec3 indirect = diffIBL + specIBL;
|
||||
vec3 color = direct + indirect * ao + emissive;
|
||||
|
||||
// Alpha from baseColor texture and factor (glTF spec)
|
||||
float alpha = clamp(baseTex.a * materialData.colorFactors.a, 0.0, 1.0);
|
||||
|
||||
Reference in New Issue
Block a user