Merge pull request #519 from DavidWyand-GG/OculusRiftUpdate2

Turbulence respects viewport and projection offset
This commit is contained in:
David Wyand 2013-11-01 13:26:05 -07:00
commit d0c476638a
6 changed files with 55 additions and 10 deletions

View file

@ -256,6 +256,7 @@ PostEffect::PostEffect()
mRTSizeSC( NULL ),
mOneOverRTSizeSC( NULL ),
mViewportOffsetSC( NULL ),
mTargetViewportSC( NULL ),
mFogDataSC( NULL ),
mFogColorSC( NULL ),
mEyePosSC( NULL ),
@ -265,6 +266,7 @@ PostEffect::PostEffect()
mNearFarSC( NULL ),
mInvNearFarSC( NULL ),
mWorldToScreenScaleSC( NULL ),
mProjectionOffsetSC( NULL ),
mWaterColorSC( NULL ),
mWaterFogDataSC( NULL ),
mAmbientColorSC( NULL ),
@ -541,6 +543,8 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
//mViewportSC = shader->getShaderConstHandle( "$viewport" );
mTargetViewportSC = mShader->getShaderConstHandle( "$targetViewport" );
mFogDataSC = mShader->getShaderConstHandle( ShaderGenVars::fogData );
mFogColorSC = mShader->getShaderConstHandle( ShaderGenVars::fogColor );
@ -554,6 +558,8 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
mMatScreenToWorldSC = mShader->getShaderConstHandle( "$matScreenToWorld" );
mMatPrevScreenToWorldSC = mShader->getShaderConstHandle( "$matPrevScreenToWorld" );
mProjectionOffsetSC = mShader->getShaderConstHandle( "$projectionOffset" );
mWaterColorSC = mShader->getShaderConstHandle( "$waterColor" );
mAmbientColorSC = mShader->getShaderConstHandle( "$ambientColor" );
mWaterFogDataSC = mShader->getShaderConstHandle( "$waterFogData" );
@ -621,6 +627,27 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
mShaderConsts->set( mRenderTargetParamsSC[i], rtParams );
}
// Target viewport (in target space)
if ( mTargetViewportSC->isValid() )
{
const Point2I& targetSize = GFX->getActiveRenderTarget()->getSize();
Point3I size(targetSize.x, targetSize.y, 0);
const RectI& viewport = GFX->getViewport();
Point2F offset((F32)viewport.point.x / (F32)targetSize.x, (F32)viewport.point.y / (F32)targetSize.y );
Point2F scale((F32)viewport.extent.x / (F32)targetSize.x, (F32)viewport.extent.y / (F32)targetSize.y );
const Point2F halfPixel( 0.5f / targetSize.x, 0.5f / targetSize.y );
Point4F targetParams;
targetParams.x = offset.x + halfPixel.x;
targetParams.y = offset.y + halfPixel.y;
targetParams.z = offset.x + scale.x - halfPixel.x;
targetParams.w = offset.y + scale.y - halfPixel.y;
mShaderConsts->set( mTargetViewportSC, targetParams );
}
// Set the fog data.
if ( mFogDataSC->isValid() )
{
@ -692,6 +719,7 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
mShaderConsts->setSafe( mNearFarSC, Point2F( state->getNearPlane(), state->getFarPlane() ) );
mShaderConsts->setSafe( mInvNearFarSC, Point2F( 1.0f / state->getNearPlane(), 1.0f / state->getFarPlane() ) );
mShaderConsts->setSafe( mWorldToScreenScaleSC, state->getWorldToScreenScale() );
mShaderConsts->setSafe( mProjectionOffsetSC, state->getFrustum().getProjectionOffset() );
mShaderConsts->setSafe( mFogColorSC, state->getSceneManager()->getFogData().color );
if ( mWaterColorSC->isValid() )

View file

@ -118,6 +118,8 @@ protected:
GFXShaderConstHandle *mViewportOffsetSC;
GFXShaderConstHandle *mTargetViewportSC;
GFXShaderConstHandle *mFogDataSC;
GFXShaderConstHandle *mFogColorSC;
GFXShaderConstHandle *mEyePosSC;
@ -127,6 +129,7 @@ protected:
GFXShaderConstHandle *mNearFarSC;
GFXShaderConstHandle *mInvNearFarSC;
GFXShaderConstHandle *mWorldToScreenScaleSC;
GFXShaderConstHandle *mProjectionOffsetSC;
GFXShaderConstHandle *mWaterColorSC;
GFXShaderConstHandle *mWaterFogDataSC;
GFXShaderConstHandle *mAmbientColorSC;

View file

@ -35,7 +35,6 @@ singleton ShaderData( PFX_TurbulenceShader )
DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl";
DXPixelShaderFile = "shaders/common/postFx/turbulenceP.hlsl";
samplerNames[0] = "$inputTex";
pixVersion = 3.0;
};
@ -45,8 +44,9 @@ singleton PostEffect( TurbulenceFx )
isEnabled = false;
allowReflectPass = true;
renderTime = "PFXAfterDiffuse";
renderBin = "ObjTranslucentBin";
renderTime = "PFXAfterBin";
renderBin = "GlowBin";
renderPriority = 10; // Render after the glows themselves
shader = PFX_TurbulenceShader;
stateBlock=PFX_TurbulenceStateBlock;

View file

@ -23,13 +23,20 @@
#include "./postFx.hlsl"
uniform float accumTime;
uniform float2 projectionOffset;
uniform float4 targetViewport;
float4 main( PFXVertToPix IN, uniform sampler2D inputTex : register(S0) ) : COLOR
{
float speed = 2.0;
float distortion = 6.0;
float y = IN.uv0.y + (cos(IN.uv0.y * distortion + accumTime * speed) * 0.01);
float x = IN.uv0.x + (sin(IN.uv0.x * distortion + accumTime * speed) * 0.01);
float y = IN.uv0.y + (cos((IN.uv0.y+projectionOffset.y) * distortion + accumTime * speed) * 0.01);
float x = IN.uv0.x + (sin((IN.uv0.x+projectionOffset.x) * distortion + accumTime * speed) * 0.01);
// Clamp the calculated uv values to be within the target's viewport
y = clamp(y, targetViewport.y, targetViewport.w);
x = clamp(x, targetViewport.x, targetViewport.z);
return tex2D (inputTex, float2(x, y));
}

View file

@ -35,7 +35,6 @@ singleton ShaderData( PFX_TurbulenceShader )
DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl";
DXPixelShaderFile = "shaders/common/postFx/turbulenceP.hlsl";
samplerNames[0] = "$inputTex";
pixVersion = 3.0;
};
@ -45,8 +44,9 @@ singleton PostEffect( TurbulenceFx )
isEnabled = false;
allowReflectPass = true;
renderTime = "PFXAfterDiffuse";
renderBin = "ObjTranslucentBin";
renderTime = "PFXAfterBin";
renderBin = "GlowBin";
renderPriority = 10; // Render after the glows themselves
shader = PFX_TurbulenceShader;
stateBlock=PFX_TurbulenceStateBlock;

View file

@ -23,13 +23,20 @@
#include "./postFx.hlsl"
uniform float accumTime;
uniform float2 projectionOffset;
uniform float4 targetViewport;
float4 main( PFXVertToPix IN, uniform sampler2D inputTex : register(S0) ) : COLOR
{
float speed = 2.0;
float distortion = 6.0;
float y = IN.uv0.y + (cos(IN.uv0.y * distortion + accumTime * speed) * 0.01);
float x = IN.uv0.x + (sin(IN.uv0.x * distortion + accumTime * speed) * 0.01);
float y = IN.uv0.y + (cos((IN.uv0.y+projectionOffset.y) * distortion + accumTime * speed) * 0.01);
float x = IN.uv0.x + (sin((IN.uv0.x+projectionOffset.x) * distortion + accumTime * speed) * 0.01);
// Clamp the calculated uv values to be within the target's viewport
y = clamp(y, targetViewport.y, targetViewport.w);
x = clamp(x, targetViewport.x, targetViewport.z);
return tex2D (inputTex, float2(x, y));
}