Jump to content

  • Log In with Google      Sign In   
  • Create Account

Awesome job so far everyone! Please give us your feedback on how our article efforts are going. We still need more finished articles for our May contest theme: Remake the Classics

kamilzubair

Member Since 08 Jan 2008
Offline Last Active Feb 24 2013 10:19 PM
-----

Topics I've Started

Emulating Render to Texture

18 December 2012 - 11:19 PM

Let's say I run this simple render to texture code:

[source lang="cpp"]m_Device->SetStreamSource( 0, m_Rect, 0, sizeof(Rect) );m_Device->SetPixelShader(NULL);m_Device->SetVertexShader( NULL );m_Device->SetFVF( Rect::FVF );DXSurface BackBuffer, Surface;m_RenderTarget->GetSurfaceLevel(0, &Surface);m_Device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBuffer);m_Device->SetRenderTarget(0, Surface);m_Device->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,0,255), 1.0f, 0 );m_Device->SetTexture( 0, m_Texture );m_Device->SetTransform( D3DTS_WORLD, &m_InWorld );m_Device->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 2);m_Device->SetRenderTarget(0, BackBuffer);m_Device->SetTexture( 0, m_RenderTarget );m_Device->SetTransform( D3DTS_WORLD, &m_OutWorld );[/source]

Now, what should I do if I want to produce the same result but without render to texture stuff ? I try to write HLSL like this :
[source lang="cpp"]m_Device->SetVertexDeclaration( m_VertexDeclaration );m_Device->SetVertexShader( m_VertexShader );m_Device->SetPixelShader(m_PixelShader);m_Device->SetTexture( 0, m_Texture1 );[/source]
with
Vertex Shader:
[source lang="plain"]struct VS_OUTPUT{float4 Pos : POSITION;float2 Tex : TEXCOORD0;};float4x4 InWorld;float4x4 OutWorld;float4x4 ViewProj;VS_OUTPUT main(float3 inPos : POSITION, float2 tex : TEXCOORD0){VS_OUTPUT Out = (VS_OUTPUT)0;Out.Pos = float4(inPos, 1);Out.Pos = mul( Out.Pos, InWorld );//reflect vertices to XY planefloat f = 2/(2 + Out.Pos.z);Out.Pos.x = Out.Pos.x * f;Out.Pos.y = Out.Pos.y * f;Out.Pos.z = 0;Out.Pos = mul( Out.Pos, OutWorld );Out.Pos = mul( Out.Pos, ProjView );Out.Tex = tex;return Out;}[/source]

PixelShader:
[source lang="plain"]struct PS_INPUT{float4 Pos : POSITION;float2 Tex : TEXCOORD0;};sampler2D Tex0;float4 main(PS_INPUT In):COLOR0{float4 Color = tex2D(Tex0, In.Tex);return Color;}[/source]
The result is like this:
Render to texture:
Posted Image

HLSL:
Posted Image

Anyway, it shows in the pictures that the shape is identical but the result of texture sampling is not. I think the perspective correct texture mapping is disturbed by my reflecting inner coordinate to XY plane.
Any idea how to correct this ?

PARTNERS