Jump to content

  • Log In with Google      Sign In   
  • Create Account


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]
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]

[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

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 ?

Any idea how to specify a negative value for x/y part of viewport ?

01 November 2010 - 04:00 AM

Hi, in my application I need to slide my viewport around arbitrary points in the screen. Say, if in a 1024*768 res application I need to slide the rendering viewport to the right until it only show half of it I can set :
v.X = 512;
v.Y = 0;
v.Width = 1024;
v.Height = 768;
v.MinZ = 0;
v.MaxZ = 0;

But if I want to slide it to the left I can't set v.X = -512 because X is defined as unsigned long. Any idea how to achieve the effect I want ?
I know viewport in Direct3D 10 allow negative value for their x/y part but sadly I don't think I can port this application yet because it still need to run in XP.

Why D3DXCreateTextureFromFileEx produces ugly image ?

10 January 2008 - 02:06 AM

I noticed that when I create texture using D3DXCreateTextureFromFileEx the end result is always jagged/blurred even if I use no filter and render that texture in transformed vertices. I tried using different filter combination and the results are still ugly. The only way I can get the good quality image is by using LoadImage and manually copy the bitmap bits to texture, but this mean I can only use bmp file. Is there a way to make D3DXCreateTextureFromFileEX produce good result ?