nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

Indexed Multiple Render Target in DirectX10

Von: Mim-R (romandark@email.it) [Profil]
Datum: 03.06.2008 19:09
Message-ID: <48457aaf$0$29589$4fafbaef@reader1.news.tin.it>
Newsgroup: it.comp.giochi.sviluppo
Ciao a tutti.
Stavo provando a implementare un esempio di questa nuova funzionalità.
In primis, creo i diversi render targets come un array di texture2D



__forceinline void MakeRenderTarget(int num)
{
ID3D10Texture2D *text;
D3D10_TEXTURE2D_DESC desc;

desc.Width = 400;
desc.Height = 400;
desc.MipLevels = 1;
desc.ArraySize = num;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D10_USAGE_DEFAULT;
desc.BindFlags = D3D10_BIND_SHADER_RESOURCE | D3D10_BIND_RENDER_TARGET;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;

device->CreateTexture2D(&desc,0,&text);

{
D3D10_RENDER_TARGET_VIEW_DESC dc;

dc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
dc.ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2DARRAY;
dc.Texture2DArray.ArraySize = num;
dc.Texture2DArray.FirstArraySlice = 0;
dc.Texture2DArray.MipSlice = 0;

device->CreateRenderTargetView(text,&dc,&rendertarget);
}

{
D3D10_SHADER_RESOURCE_VIEW_DESC dc;
dc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
dc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DARRAY;
dc.Texture2D.MipLevels = 1;
dc.Texture2DArray.MostDetailedMip = 0;
dc.Texture2DArray.FirstArraySlice = 0;
dc.Texture2DArray.ArraySize = num;

device->CreateShaderResourceView(text,&dc,&ShaderText);
}

{
text->Release();

D3D10_DEPTH_STENCIL_VIEW_DESC dc;
desc.BindFlags = D3D10_BIND_DEPTH_STENCIL;
desc.Format = DXGI_FORMAT_D32_FLOAT;

device->CreateTexture2D(&desc,NULL,&text);

dc.Format = DXGI_FORMAT_D32_FLOAT;
dc.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2DARRAY;
dc.Texture2DArray.MipSlice = 0;
dc.Texture2DArray.ArraySize = num;
dc.Texture2DArray.FirstArraySlice = 0;

device->CreateDepthStencilView(text,&dc,&depth);

text->Release();
}

}




Nella funzione di rendering, poi faccio

...
shader->GetVariableByIndex(7)->AsShaderResource()->SetResource(ShaderText);
shader->GetVariableByIndex(1)->AsMatrix()->SetMatrix((float*)&mat);
shader->GetTechniqueByIndex(0)->GetPassByIndex(1)->Apply(0);

Cubo.DrawCollada(device); //questa funziona, non vi preoccupate.

swapChain->Present(0,0); //Front buffer presentation.
...



E questo è lo shader che uso

float4x4 ViewMatrix;
float4x4 WorldMatrix;
float4x4 ProjMatrix;
float4  LightDirection;
float4  MaterialColor;
float3  EyePosition;
texture2D Texture;
Texture2DArray RenderText;

SamplerState SamplText
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};

SamplerState RenderSampl
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Mirror;
AddressV = Mirror;
};

struct VS_INPUT
{
float4 Pos : POSITION;
float3 Tex : TEXCOORD;
float3 Nor : NORMAL;
};

struct PS_INPUT
{
float4 Pos : SV_POSITION;
float4 WorldPos: WORLDPOSITION;
float3 Tex : TEXCOORD;
float3 Nor : NORMAL;
};

PS_INPUT vs_main(VS_INPUT Input)
{
PS_INPUT Out = (PS_INPUT)0;
Out.Pos = mul(mul(mul(Input.Pos,WorldMatrix),ViewMatrix),ProjMatrix);
Out.WorldPos = mul(Input.Pos,WorldMatrix);
Out.Tex = Input.Tex;
Out.Nor = mul(Input.Nor,WorldMatrix);
return Out;
}

float4 ps_main(PS_INPUT In) : SV_TARGET
{
float3 L = normalize(LightDirection.xyz);
float4 D = saturate(dot(In.Nor,L)  * float4(1,0.0,0.0,1) * MaterialColor);
float3 V = normalize(EyePosition - In.WorldPos);
float3 R = normalize(2.0F * In.Nor * dot(In.Nor,L) - L);
float4 S = pow(max(0.0F,dot(R,V)),10);

return saturate(D + S);

}

struct VGS_TEXT_INPUT
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD;
};

struct PS_TEXT_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD;
uint Index: SV_RenderTargetArrayIndex;
};



VGS_TEXT_INPUT vs_text_main(VGS_TEXT_INPUT In)
{
return In;
}

[maxvertexcount(24)]
void gs_text_main(triangle VGS_TEXT_INPUT In[3],inout
TriangleStream<PS_TEXT_INPUT> Stream)
{
PS_TEXT_INPUT New = (PS_TEXT_INPUT)0;
for (int i = 0; i < 6; i++)
{
New.Index = i;

for (int t = 0; t < 3; t++)
{
New.Tex = In[t].Tex;
New.Pos = mul(mul(mul(In[t].Pos,WorldMatrix),ViewMatrix),ProjMatrix);

Stream.Append(New);
}

Stream.RestartStrip();
}
}

float4 ps_text_main(PS_TEXT_INPUT In) : SV_TARGET
{
return RenderText.Sample(RenderSampl,float3(In.Tex,In.Index)) * In.Index;
}

technique10 RenderToTexture
{
Pass WhatYouWantToRenderOnTheTexture
{
SetVertexShader( CompileShader( vs_4_0, vs_main() ) );
SetGeometryShader(NULL);
SetPixelShader( CompileShader( ps_4_0, ps_main() ) );
}

Pass TexturePass
{
SetVertexShader( CompileShader( vs_4_0,vs_text_main() ) );
SetGeometryShader( CompileShader ( gs_4_0, gs_text_main() ) );
SetPixelShader( CompileShader( ps_4_0,ps_text_main() ) );
}
}

Se compilo e avvio, vedo tutto il cubo nero
Se tolgo la moltiplicazione * In.Index nel pixel shader, vedo la stessa
scena su tutto il cubo; se però nel float 3 metto 0 come indice vedo la
stessa cosa: segno che non renderizza su 6 targets diversi. Se metto un
numero diverso da 0, sul cubo vedo solo il colore del clear e non la mesh
sopra.
Cosa sbaglio?



[ Auf dieses Posting antworten ]

Antworten