Emulating Render to Texture

Started by
6 comments, last by ginkgo 11 years, 3 months ago
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 plane
float 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:
render%20to%20texture.png

HLSL:
emulate.png

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 ?
Advertisement

I don't know enough about the math behind this to give a definite answer, but take a look at this: http://www.xyzw.us/~cass/qcoord/

It seems in DirectX 9 you can't customize the way it does texturing. There is interpolation modifier to turn off perspective texturing but only for shader model 4 :(.

You can do perspective correction yourself by interpolating iz=1/z and iuv=uv/z as varyings and reconstructing uv in the fragment shader as iuv/iz.

What is the value of iz if z = 0 ?

If z = 0, then you have a problem with your perspective. A vertex is located on the eye-plane.

This division by zero problem can't happen in regular graphics pipelines because the depth-division happens after near-clipping.

I guess my first attempt for avoiding this problem would simply be adding a very small bias value to z if it's 0.

Wait, is z means the content of z buffer ? I thought by z you mean the z coordinate of the vertex. I got confused, because vertex with z coordinate 0 is a valid vertex.

Z is the z coordinate of the vertex.

This topic is closed to new replies.

Advertisement