Fix to allow parallax mapping with dxtnm textures via the red channel.

This commit is contained in:
rextimmy 2014-07-03 17:56:47 +10:00
parent feec36731e
commit 3c56bf3a56
5 changed files with 52 additions and 8 deletions

View file

@ -389,11 +389,9 @@ void ProcessedShaderMaterial::_determineFeatures( U32 stageNum,
// cannot do on SM 2.0 and below.
if ( shaderVersion > 2.0f )
{
// Only allow parallax if we have a normal map and
// we're not using DXTnm compression.
if ( mMaterial->mParallaxScale[stageNum] > 0.0f &&
fd.features[ MFT_NormalMap ] &&
!fd.features[ MFT_IsDXTnm ] )
fd.features[ MFT_NormalMap ] )
fd.features.addFeature( MFT_Parallax );
// If not parallax then allow per-pixel specular if

View file

@ -345,8 +345,16 @@ void ParallaxFeatHLSL::processPix( Vector<ShaderComponent*> &componentList,
Var *normalMap = getNormalMapTex();
// Call the library function to do the rest.
meta->addStatement( new GenOp( " @.xy += parallaxOffset( @, @.xy, @, @ );\r\n",
texCoord, normalMap, texCoord, negViewTS, parallaxInfo ) );
if(fd.features.hasFeature( MFT_IsDXTnm, getProcessIndex() ))
{
meta->addStatement( new GenOp( " @.xy += parallaxOffsetDxtnm( @, @.xy, @, @ );\r\n",
texCoord, normalMap, texCoord, negViewTS, parallaxInfo ) );
}
else
{
meta->addStatement( new GenOp( " @.xy += parallaxOffset( @, @.xy, @, @ );\r\n",
texCoord, normalMap, texCoord, negViewTS, parallaxInfo ) );
}
// TODO: Fix second UV maybe?

View file

@ -456,8 +456,16 @@ void TerrainDetailMapFeatHLSL::processPix( Vector<ShaderComponent*> &component
Var *normalMap = _getNormalMapTex();
// Call the library function to do the rest.
meta->addStatement( new GenOp( " @.xy += parallaxOffset( @, @.xy, @, @.z * @ );\r\n",
inDet, normalMap, inDet, negViewTS, detailInfo, detailBlend ) );
if(fd.features.hasFeature( MFT_IsDXTnm, detailIndex ) )
{
meta->addStatement( new GenOp( " @.xy += parallaxOffsetDxtnm( @, @.xy, @, @.z * @ );\r\n",
inDet, normalMap, inDet, negViewTS, detailInfo, detailBlend ) );
}
else
{
meta->addStatement( new GenOp( " @.xy += parallaxOffset( @, @.xy, @, @.z * @ );\r\n",
inDet, normalMap, inDet, negViewTS, detailInfo, detailBlend ) );
}
}
// If this is a prepass then we skip color.

View file

@ -151,6 +151,21 @@ float2 parallaxOffset( sampler2D texMap, float2 texCoord, float3 negViewTS, floa
return offset;
}
/// Same as parallaxOffset but for dxtnm where depth is stored in the red channel instead of the alpha
float2 parallaxOffsetDxtnm(sampler2D texMap, float2 texCoord, float3 negViewTS, float depthScale)
{
float depth = tex2D(texMap, texCoord).r;
float2 offset = negViewTS.xy * (depth * depthScale);
for (int i = 0; i < PARALLAX_REFINE_STEPS; i++)
{
depth = (depth + tex2D(texMap, texCoord + offset).r) * 0.5;
offset = negViewTS.xy * (depth * depthScale);
}
return offset;
}
/// The maximum value for 16bit per component integer HDR encoding.
static const float HDR_RGB16_MAX = 100.0;

View file

@ -151,6 +151,21 @@ float2 parallaxOffset( sampler2D texMap, float2 texCoord, float3 negViewTS, floa
return offset;
}
/// Same as parallaxOffset but for dxtnm where depth is stored in the red channel instead of the alpha
float2 parallaxOffsetDxtnm(sampler2D texMap, float2 texCoord, float3 negViewTS, float depthScale)
{
float depth = tex2D(texMap, texCoord).r;
float2 offset = negViewTS.xy * (depth * depthScale);
for (int i = 0; i < PARALLAX_REFINE_STEPS; i++)
{
depth = (depth + tex2D(texMap, texCoord + offset).r) * 0.5;
offset = negViewTS.xy * (depth * depthScale);
}
return offset;
}
/// The maximum value for 16bit per component integer HDR encoding.
static const float HDR_RGB16_MAX = 100.0;