mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-16 05:03:47 +00:00
mergefix
This commit is contained in:
parent
f15fd381aa
commit
fd0c90c575
1 changed files with 34 additions and 101 deletions
|
|
@ -82,97 +82,32 @@ float3 iblSkylightSpecular(Surface surface, ProbeData probe)
|
|||
|
||||
float3 iblBoxDiffuse( Surface surface, ProbeData probe)
|
||||
{
|
||||
float3 wsPosition;
|
||||
float radius;
|
||||
float3 boxMin;
|
||||
float3 boxMax;
|
||||
float attenuation;
|
||||
float4x4 worldToLocal;
|
||||
uint probeIdx;
|
||||
uint type; //box = 0, sphere = 1
|
||||
float contribution;
|
||||
float3 refPosition;
|
||||
float3 pad;
|
||||
|
||||
inline void defineSphereSpaceInfluence(Surface surface, float3 wsEyeRay)
|
||||
{
|
||||
float3 L = wsPosition.xyz - surface.P;
|
||||
contribution = 1.0 - length(L) / radius;
|
||||
}
|
||||
float3 dir = boxProject(surface, probe);
|
||||
|
||||
inline void defineBoxSpaceInfluence(Surface surface, float3 wsEyeRay)
|
||||
{
|
||||
float3 surfPosLS = mul(worldToLocal, float4(surface.P, 1.0)).xyz;
|
||||
float lod = surface.roughness*cubeMips;
|
||||
float3 color = TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, probe.probeIdx, lod).xyz;
|
||||
|
||||
float3 boxMinLS = wsPosition.xyz - (float3(1, 1, 1)*radius);
|
||||
float3 boxMaxLS = wsPosition.xyz + (float3(1, 1, 1)*radius);
|
||||
return color;
|
||||
}
|
||||
|
||||
float boxOuterRange = length(boxMaxLS - boxMinLS);
|
||||
float boxInnerRange = boxOuterRange / attenuation;
|
||||
float3 iblBoxSpecular(Surface surface, ProbeData probe)
|
||||
{
|
||||
// BRDF
|
||||
float2 brdf = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.roughness, surface.NdotV,0.0,0.0)).xy;
|
||||
|
||||
float3 localDir = float3(abs(surfPosLS.x), abs(surfPosLS.y), abs(surfPosLS.z));
|
||||
localDir = (localDir - boxInnerRange) / (boxOuterRange - boxInnerRange);
|
||||
float3 dir = boxProject(surface, probe);
|
||||
|
||||
contribution = max(localDir.x, max(localDir.y, localDir.z)) * -1;
|
||||
}
|
||||
|
||||
// Box Projected IBL Lighting
|
||||
// Based on: http://www.gamedev.net/topic/568829-box-projected-cubemap-environment-mapping/
|
||||
// and https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
|
||||
inline float3 boxProject(Surface surface) //float3 wsPosition, float3 wsEyeRay, float3 reflectDir, float3 boxWSPos, float3 boxMin, float3 boxMax
|
||||
{
|
||||
float3 nrdir = normalize(surface.R);
|
||||
float3 offset = surface.P;
|
||||
float3 plane1vec = (boxMax - offset) / nrdir;
|
||||
float3 plane2vec = (boxMin - offset) / nrdir;
|
||||
// Radiance (Specular)
|
||||
#if DEBUGVIZ_SPECCUBEMAP == 0
|
||||
float lod = surface.roughness*cubeMips;
|
||||
#elif DEBUGVIZ_SPECCUBEMAP == 1
|
||||
float lod = 0;
|
||||
#endif
|
||||
|
||||
float3 furthestPlane = max(plane1vec, plane2vec);
|
||||
float dist = min(min(furthestPlane.x, furthestPlane.y), furthestPlane.z);
|
||||
float3 posonbox = offset + nrdir * dist;
|
||||
|
||||
return posonbox - refPosition;
|
||||
}
|
||||
|
||||
inline float3 iblBoxDiffuse( Surface surface)
|
||||
{
|
||||
float3 dir = boxProject(surface);
|
||||
|
||||
float lod = surface.roughness*cubeMips;
|
||||
float3 color = TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, probeIdx, lod).xyz;
|
||||
if (contribution>0)
|
||||
return color*contribution;
|
||||
else
|
||||
return float3(0,0,0);
|
||||
}
|
||||
|
||||
inline float3 iblBoxSpecular(Surface surface)
|
||||
{
|
||||
// BRDF
|
||||
float2 brdf = TORQUE_TEX2DLOD(BRDFTexture, float4(surface.roughness, surface.NdotV,0.0,0.0)).xy;
|
||||
|
||||
float3 dir = boxProject(surface);
|
||||
|
||||
// Radiance (Specular)
|
||||
#if DEBUGVIZ_SPECCUBEMAP == 0
|
||||
float lod = surface.roughness*cubeMips;
|
||||
#elif DEBUGVIZ_SPECCUBEMAP == 1
|
||||
float lod = 0;
|
||||
#endif
|
||||
|
||||
float3 color = TORQUE_TEXCUBEARRAYLOD(cubeMapAR, dir, probeIdx, lod).xyz * (brdf.x + brdf.y);
|
||||
|
||||
if (contribution>0)
|
||||
return color*contribution;
|
||||
else
|
||||
return float3(0,0,0);
|
||||
}
|
||||
|
||||
inline void reweight(float bias)
|
||||
{
|
||||
contribution = bias;
|
||||
}
|
||||
};
|
||||
float3 color = TORQUE_TEXCUBEARRAYLOD(cubeMapAR, dir, probe.probeIdx, lod).xyz * (brdf.x + brdf.y);
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
float4 main( PFXVertToPix IN ) : SV_TARGET
|
||||
{
|
||||
|
|
@ -190,6 +125,7 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
|
|||
}
|
||||
|
||||
int i = 0;
|
||||
float blendVal[MAX_PROBES];
|
||||
float blendFactor[MAX_PROBES];
|
||||
float blendSum = 0;
|
||||
float blendFacSum = 0;
|
||||
|
|
@ -214,11 +150,11 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
|
|||
|
||||
if (probes[i].type == 0) //box
|
||||
{
|
||||
probes[i].defineBoxSpaceInfluence(surface, IN.wsEyeRay);
|
||||
blendVal[i] = defineBoxSpaceInfluence(surface, probes[i], IN.wsEyeRay);
|
||||
}
|
||||
else if (probes[i].type == 1) //sphere
|
||||
{
|
||||
probes[i].defineSphereSpaceInfluence(surface,IN.wsEyeRay);
|
||||
blendVal[i] = defineSphereSpaceInfluence(surface, probes[i], IN.wsEyeRay);
|
||||
}
|
||||
else //skylight
|
||||
{
|
||||
|
|
@ -240,36 +176,33 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
|
|||
{
|
||||
if (numProbes>1)
|
||||
{
|
||||
blendFactor[i] = (( probes[i].contribution / blendSum)) / (numProbes - 1);
|
||||
blendFactor[i] *= (( probes[i].contribution) / invBlendSum);
|
||||
blendFactor[i] = ((1.0f - blendVal[i] / blendSum)) / (numProbes - 1);
|
||||
blendFactor[i] *= ((1.0f - blendVal[i]) / invBlendSum);
|
||||
blendFacSum += blendFactor[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
blendFactor[i] = probes[i].contribution;
|
||||
blendFacSum = probes[i].contribution;
|
||||
blendFactor[i] = blendVal[i];
|
||||
blendFacSum = blendVal[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Normalize blendVal
|
||||
#if DEBUGVIZ_ATTENUATION == 0 //this can likely be removed when we fix the above normalization behavior
|
||||
if (blendFacSum == 0.0f) // Possible with custom weight
|
||||
{
|
||||
blendFacSum = 1.0f;
|
||||
}
|
||||
#endif
|
||||
|
||||
float invBlendSumWeighted = 1.0f / blendFacSum;
|
||||
for (i = 0; i < numProbes; ++i)
|
||||
{
|
||||
blendFactor[i] *= invBlendSumWeighted;
|
||||
probes[i].reweight(blendFactor[i]);
|
||||
}
|
||||
|
||||
#if DEBUGVIZ_ATTENUATION == 1
|
||||
float attenVis = 0;
|
||||
for (i = 0; i < numProbes; ++i)
|
||||
{
|
||||
attenVis += probes[i].contribution;
|
||||
}
|
||||
return float4(attenVis, attenVis, attenVis, 1);
|
||||
return float4(blendFacSum, blendFacSum, blendFacSum, 1);
|
||||
#endif
|
||||
|
||||
#if DEBUGVIZ_CONTRIB == 1
|
||||
|
|
@ -277,10 +210,10 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
|
|||
float3 finalContribColor = float3(0, 0, 0);
|
||||
for (i = 0; i < numProbes; ++i)
|
||||
{
|
||||
if (probes[i].contribution == 0)
|
||||
if (blendFactor[i] == 0)
|
||||
continue;
|
||||
|
||||
finalContribColor += probes[i].contribution * probeContribColors[i].rgb;
|
||||
finalContribColor += blendFactor[i] * probeContribColors[i].rgb;
|
||||
}
|
||||
|
||||
return float4(finalContribColor, 1);
|
||||
|
|
@ -297,7 +230,7 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
|
|||
kD *= 1.0 - surface.metalness;
|
||||
for (i = 0; i < numProbes; ++i)
|
||||
{
|
||||
if (probes[i].contribution == 0)
|
||||
if (blendVal[i] == 0)
|
||||
continue;
|
||||
|
||||
if (probes[i].type == 2) //skylight
|
||||
|
|
@ -351,4 +284,4 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
|
|||
|
||||
return float4(cubeColor, 1);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue