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 ), mRTSizeSC( NULL ),
mOneOverRTSizeSC( NULL ), mOneOverRTSizeSC( NULL ),
mViewportOffsetSC( NULL ), mViewportOffsetSC( NULL ),
mTargetViewportSC( NULL ),
mFogDataSC( NULL ), mFogDataSC( NULL ),
mFogColorSC( NULL ), mFogColorSC( NULL ),
mEyePosSC( NULL ), mEyePosSC( NULL ),
@ -265,6 +266,7 @@ PostEffect::PostEffect()
mNearFarSC( NULL ), mNearFarSC( NULL ),
mInvNearFarSC( NULL ), mInvNearFarSC( NULL ),
mWorldToScreenScaleSC( NULL ), mWorldToScreenScaleSC( NULL ),
mProjectionOffsetSC( NULL ),
mWaterColorSC( NULL ), mWaterColorSC( NULL ),
mWaterFogDataSC( NULL ), mWaterFogDataSC( NULL ),
mAmbientColorSC( NULL ), mAmbientColorSC( NULL ),
@ -541,6 +543,8 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
//mViewportSC = shader->getShaderConstHandle( "$viewport" ); //mViewportSC = shader->getShaderConstHandle( "$viewport" );
mTargetViewportSC = mShader->getShaderConstHandle( "$targetViewport" );
mFogDataSC = mShader->getShaderConstHandle( ShaderGenVars::fogData ); mFogDataSC = mShader->getShaderConstHandle( ShaderGenVars::fogData );
mFogColorSC = mShader->getShaderConstHandle( ShaderGenVars::fogColor ); mFogColorSC = mShader->getShaderConstHandle( ShaderGenVars::fogColor );
@ -554,6 +558,8 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
mMatScreenToWorldSC = mShader->getShaderConstHandle( "$matScreenToWorld" ); mMatScreenToWorldSC = mShader->getShaderConstHandle( "$matScreenToWorld" );
mMatPrevScreenToWorldSC = mShader->getShaderConstHandle( "$matPrevScreenToWorld" ); mMatPrevScreenToWorldSC = mShader->getShaderConstHandle( "$matPrevScreenToWorld" );
mProjectionOffsetSC = mShader->getShaderConstHandle( "$projectionOffset" );
mWaterColorSC = mShader->getShaderConstHandle( "$waterColor" ); mWaterColorSC = mShader->getShaderConstHandle( "$waterColor" );
mAmbientColorSC = mShader->getShaderConstHandle( "$ambientColor" ); mAmbientColorSC = mShader->getShaderConstHandle( "$ambientColor" );
mWaterFogDataSC = mShader->getShaderConstHandle( "$waterFogData" ); mWaterFogDataSC = mShader->getShaderConstHandle( "$waterFogData" );
@ -621,6 +627,27 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
mShaderConsts->set( mRenderTargetParamsSC[i], rtParams ); 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. // Set the fog data.
if ( mFogDataSC->isValid() ) if ( mFogDataSC->isValid() )
{ {
@ -692,6 +719,7 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
mShaderConsts->setSafe( mNearFarSC, Point2F( state->getNearPlane(), state->getFarPlane() ) ); mShaderConsts->setSafe( mNearFarSC, Point2F( state->getNearPlane(), state->getFarPlane() ) );
mShaderConsts->setSafe( mInvNearFarSC, Point2F( 1.0f / state->getNearPlane(), 1.0f / state->getFarPlane() ) ); mShaderConsts->setSafe( mInvNearFarSC, Point2F( 1.0f / state->getNearPlane(), 1.0f / state->getFarPlane() ) );
mShaderConsts->setSafe( mWorldToScreenScaleSC, state->getWorldToScreenScale() ); mShaderConsts->setSafe( mWorldToScreenScaleSC, state->getWorldToScreenScale() );
mShaderConsts->setSafe( mProjectionOffsetSC, state->getFrustum().getProjectionOffset() );
mShaderConsts->setSafe( mFogColorSC, state->getSceneManager()->getFogData().color ); mShaderConsts->setSafe( mFogColorSC, state->getSceneManager()->getFogData().color );
if ( mWaterColorSC->isValid() ) if ( mWaterColorSC->isValid() )

View file

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

View file

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

View file

@ -23,13 +23,20 @@
#include "./postFx.hlsl" #include "./postFx.hlsl"
uniform float accumTime; uniform float accumTime;
uniform float2 projectionOffset;
uniform float4 targetViewport;
float4 main( PFXVertToPix IN, uniform sampler2D inputTex : register(S0) ) : COLOR float4 main( PFXVertToPix IN, uniform sampler2D inputTex : register(S0) ) : COLOR
{ {
float speed = 2.0; float speed = 2.0;
float distortion = 6.0; float distortion = 6.0;
float y = IN.uv0.y + (cos(IN.uv0.y * 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 * 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)); return tex2D (inputTex, float2(x, y));
} }

View file

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

View file

@ -23,13 +23,20 @@
#include "./postFx.hlsl" #include "./postFx.hlsl"
uniform float accumTime; uniform float accumTime;
uniform float2 projectionOffset;
uniform float4 targetViewport;
float4 main( PFXVertToPix IN, uniform sampler2D inputTex : register(S0) ) : COLOR float4 main( PFXVertToPix IN, uniform sampler2D inputTex : register(S0) ) : COLOR
{ {
float speed = 2.0; float speed = 2.0;
float distortion = 6.0; float distortion = 6.0;
float y = IN.uv0.y + (cos(IN.uv0.y * 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 * 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)); return tex2D (inputTex, float2(x, y));
} }