diff --git a/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl index 1701317af..334ac6669 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeArrayP.hlsl @@ -53,23 +53,14 @@ float3 boxProject(float3 wsPosition, float3 reflectDir, float3 boxWSPos, float3 return posonbox - boxWSPos; } -float3 iblBoxDiffuse( Surface surface, - TORQUE_SAMPLERCUBE(irradianceCube), - float3 boxPos, - float3 boxMin, - float3 boxMax) +float3 iblBoxDiffuse( Surface surface, int id) { - float3 cubeN = boxProject(surface.P, surface.N, boxPos, boxMin, boxMax); + float3 cubeN = boxProject(surface.P, surface.N, inProbePosArray[id], bbMinArray[id], bbMaxArray[id]); cubeN.z *=-1; - return TORQUE_TEXCUBELOD(irradianceCube, float4(cubeN,0)).xyz; + return TORQUE_TEXCUBELOD(irradianceCubemap[id], float4(cubeN,0)).xyz; } -float3 iblBoxSpecular(float3 normal, float3 wsPos, float roughness, float3 surfToEye, - TORQUE_SAMPLER2D(brdfTexture), - TORQUE_SAMPLERCUBE(radianceCube), - float3 boxPos, - float3 boxMin, - float3 boxMax) +float3 iblBoxSpecular(Surface surface, float3 surfToEye, TORQUE_SAMPLER2D(brdfTexture), int id) { float ndotv = clamp(dot(normal, surfToEye), 0.0, 1.0); @@ -77,25 +68,26 @@ float3 iblBoxSpecular(float3 normal, float3 wsPos, float roughness, float3 surfT float2 brdf = TORQUE_TEX2DLOD(brdfTexture, float4(roughness, ndotv,0.0,0.0)).xy; // Radiance (Specular) - float lod = roughness*cubeMips; - float3 r = reflect(surfToEye, normal); + float lod = surface.roughness*cubeMips; + float3 r = reflect(surfToEye, surface.N); float3 cubeR = normalize(r); - cubeR = boxProject(wsPos, cubeR, boxPos, boxMin, boxMax); + cubeR = boxProject(surface.P, surface.N, inProbePosArray[id], bbMinArray[id], bbMaxArray[id]); - float3 radiance = TORQUE_TEXCUBELOD(radianceCube, float4(cubeR, lod)).xyz * (brdf.x + brdf.y); + float3 radiance = TORQUE_TEXCUBELOD(cubeMap[id], float4(cubeR, lod)).xyz * (brdf.x + brdf.y); return radiance; } -float defineBoxSpaceInfluence(float3 surfPosWS, float3 probePos, float4x4 worldToObj, float radius, float atten) +float defineBoxSpaceInfluence(Surface surface, int id) { - float3 surfPosLS = mul( worldToObj, float4(surfPosWS,1.0)).xyz; + float tempAttenVal = 3.5; //replace with per probe atten + float3 surfPosLS = mul( worldToObjArray[id], float4(surface.P,1.0)).xyz; - float3 boxMinLS = probePos-(float3(1,1,1)*radius); - float3 boxMaxLS = probePos+(float3(1,1,1)*radius); + float3 boxMinLS = inProbePosArray[id]-(float3(1,1,1)*radius[id]); + float3 boxMaxLS = inProbePosArray[id]+(float3(1,1,1)*radius[id]); float boxOuterRange = length(boxMaxLS - boxMinLS); - float boxInnerRange = boxOuterRange / atten; + float boxInnerRange = boxOuterRange / tempAttenVal; float3 localDir = float3(abs(surfPosLS.x), abs(surfPosLS.y), abs(surfPosLS.z)); localDir = (localDir - boxInnerRange) / (boxOuterRange - boxInnerRange); @@ -140,8 +132,7 @@ float4 main( ConvexConnectP IN ) : SV_TARGET } else { - float tempAttenVal = 3.5; - blendVal[i] = defineBoxSpaceInfluence(surface.P, inProbePosArray[i], worldToObjArray[i], radius[i], tempAttenVal); + blendVal[i] = defineBoxSpaceInfluence(surface, i); blendVal[i] = max(0,blendVal[i]); } blendSum += blendVal[i]; @@ -180,8 +171,9 @@ float4 main( ConvexConnectP IN ) : SV_TARGET kD *= 1.0 - surface.metalness; for (i = 0; i < numProbes; ++i) { - irradiance += blendVal[i]*iblBoxDiffuse(surface,TORQUE_SAMPLERCUBE_MAKEARG(irradianceCubemap[i]), inProbePosArray[i], bbMinArray[i], bbMaxArray[i]); - specular += blendVal[i]*F*iblBoxSpecular(surface.N, surface.P, surface.roughness, surfToEye, TORQUE_SAMPLER2D_MAKEARG(BRDFTexture), TORQUE_SAMPLERCUBE_MAKEARG(cubeMap[i]), inProbePosArray[i], bbMinArray[i], bbMaxArray[i]); + irradiance += blendVal[i]*iblBoxDiffuse(surface,i); + + specular += blendVal[i]*F*iblBoxSpecular(surface, surfToEye, TORQUE_SAMPLER2D_MAKEARG(BRDFTexture)); } //final diffuse color float3 diffuse = kD * irradiance * surface.baseColor.rgb;