swap methods on over to surface+id ref for uniform arrays

This commit is contained in:
Azaezel 2019-01-16 03:46:37 -06:00
parent 0efe0a5856
commit a526bbe2b0

View file

@ -53,23 +53,14 @@ float3 boxProject(float3 wsPosition, float3 reflectDir, float3 boxWSPos, float3
return posonbox - boxWSPos; return posonbox - boxWSPos;
} }
float3 iblBoxDiffuse( Surface surface, float3 iblBoxDiffuse( Surface surface, int id)
TORQUE_SAMPLERCUBE(irradianceCube),
float3 boxPos,
float3 boxMin,
float3 boxMax)
{ {
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; 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, float3 iblBoxSpecular(Surface surface, float3 surfToEye, TORQUE_SAMPLER2D(brdfTexture), int id)
TORQUE_SAMPLER2D(brdfTexture),
TORQUE_SAMPLERCUBE(radianceCube),
float3 boxPos,
float3 boxMin,
float3 boxMax)
{ {
float ndotv = clamp(dot(normal, surfToEye), 0.0, 1.0); 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; float2 brdf = TORQUE_TEX2DLOD(brdfTexture, float4(roughness, ndotv,0.0,0.0)).xy;
// Radiance (Specular) // Radiance (Specular)
float lod = roughness*cubeMips; float lod = surface.roughness*cubeMips;
float3 r = reflect(surfToEye, normal); float3 r = reflect(surfToEye, surface.N);
float3 cubeR = normalize(r); 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; 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 boxMinLS = inProbePosArray[id]-(float3(1,1,1)*radius[id]);
float3 boxMaxLS = probePos+(float3(1,1,1)*radius); float3 boxMaxLS = inProbePosArray[id]+(float3(1,1,1)*radius[id]);
float boxOuterRange = length(boxMaxLS - boxMinLS); 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)); float3 localDir = float3(abs(surfPosLS.x), abs(surfPosLS.y), abs(surfPosLS.z));
localDir = (localDir - boxInnerRange) / (boxOuterRange - boxInnerRange); localDir = (localDir - boxInnerRange) / (boxOuterRange - boxInnerRange);
@ -140,8 +132,7 @@ float4 main( ConvexConnectP IN ) : SV_TARGET
} }
else else
{ {
float tempAttenVal = 3.5; blendVal[i] = defineBoxSpaceInfluence(surface, i);
blendVal[i] = defineBoxSpaceInfluence(surface.P, inProbePosArray[i], worldToObjArray[i], radius[i], tempAttenVal);
blendVal[i] = max(0,blendVal[i]); blendVal[i] = max(0,blendVal[i]);
} }
blendSum += blendVal[i]; blendSum += blendVal[i];
@ -180,8 +171,9 @@ float4 main( ConvexConnectP IN ) : SV_TARGET
kD *= 1.0 - surface.metalness; kD *= 1.0 - surface.metalness;
for (i = 0; i < numProbes; ++i) for (i = 0; i < numProbes; ++i)
{ {
irradiance += blendVal[i]*iblBoxDiffuse(surface,TORQUE_SAMPLERCUBE_MAKEARG(irradianceCubemap[i]), inProbePosArray[i], bbMinArray[i], bbMaxArray[i]); irradiance += blendVal[i]*iblBoxDiffuse(surface,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]);
specular += blendVal[i]*F*iblBoxSpecular(surface, surfToEye, TORQUE_SAMPLER2D_MAKEARG(BRDFTexture));
} }
//final diffuse color //final diffuse color
float3 diffuse = kD * irradiance * surface.baseColor.rgb; float3 diffuse = kD * irradiance * surface.baseColor.rgb;