2012-02-23 9 views
5

primo accordo fino sto usando:DirectX spazio clip tessitura coordinate

  • DirectX 10
  • C++

Va bene questo è un po 'di un bizzarro uno a me, non avrei solito poni la domanda, ma sono stato costretto dalle circostanze. Ho due triangoli (non un quad per i motivi per cui non entrerò!) A schermo intero, allineati allo schermo perché non vengono trasformati.

Nella dichiarazione vertice DirectX sto passando a 3 componente galleggiante (Pos x, y, z) e 2 galleggiante componente (Texcoord x, y). Texcoord z è riservato agli array texture2d, che al momento sono predefinito a 0 nel pixel shader.

Ho scritto questo per realizzare il semplice compito:

float fStartX = -1.0f; 
float fEndX = 1.0f; 
float fStartY = 1.0f; 
float fEndY = -1.0f; 
float fStartU = 0.0f; 
float fEndU = 1.0f; 
float fStartV = 0.0f; 
float fEndV = 1.0f; 
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fStartY, 0, fEndU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV)); 
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV)); 
vmvUIVerts.push_back(CreateVertex(fStartX, fEndY, 0, fStartU, fEndV)); 

layout IA: (Aggiornamento)

D3D10_INPUT_ELEMENT_DESC ieDesc[2] = { 
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, 
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,12, D3D10_INPUT_PER_VERTEX_DATA, 0 } 
}; 

dati raggiunge il vertex shader nel seguente formato: (Update)

struct VS_INPUT 
{ 
    float3 fPos   :POSITION; 
    float3 fTexcoord  :TEXCOORD0; 
} 

All'interno del mio vertex e Pixel shader non sta accadendo molto per questa particolare chiamata, il pixel shader esegue la maggior parte del lavoro di campionamento da una trama usando le coordinate UV specificate. Tuttavia, questo non funziona come previsto, sembra che sto ottenendo solo 1 pixel della trama campionata.

La soluzione era in pixel shader di fare quanto segue: (Aggiornamento)

sampler s0      : register(s0); 
Texture2DArray<float4> meshTex : register(t0); 
float4 psMain(in VS_OUTPUT vOut) : SV_TARGET 
{ 
    float4 Color; 
    vOut.fTexcoord.z = 0; 
    vOut.fTexcoord.x = vOut.fPosObj.x * 0.5f; 
    vOut.fTexcoord.y = vOut.fPosObj.y * 0.5f; 
    vOut.fTexcoord.x += 0.5f; 
    vOut.fTexcoord.y += 0.5f; 
    Color = quadTex.Sample(s0, vOut.fTexcoord); 
    Color.a = 1.0f; 
    return Color; 
} 

E 'stato anche interessante notare che questo ha lavorato con il seguente VS fuori struct definito nelle shaders:

struct VS_OUTPUT 
{ 
    float4 fPos   :POSITION0; // SV_POSITION wont work in this case 
    float3 fTexcoord :TEXCOORD0; 
} 

Ora ho una trama che è allungata per adattarsi all'intero schermo, entrambi i triangoli coprono già questo, ma perché la trama UV non è stata utilizzata come previsto?

Per chiarire Sto utilizzando un campionatore punto e provato sia il morsetto e il confezionamento UV.

ero un po 'curioso e trovato una soluzione/soluzione di cui sopra, però preferirei non avere a che fare, se qualcuno sa perché sta accadendo?

risposta

1

Ok bene, per uno, coordina la struttura esterna del 0..1 gamma venga schiacciato. Ho fatto l'errore di supporre che andando nello spazio clip da -1 a +1, le coordinate della trama sarebbero state uguali. Questo non è il caso, vanno ancora da 0.0 a 1.0.

Il motivo per cui il codice del pixel shader funzionava, era perché stava usando lo spazio fermaglio x, y, z coordinate di sovrascrivere automaticamente queste coordinate trama; una svista da parte mia. Tuttavia, il codice pixel shader risultati in tratto texture su uno schermo pieno 'quad', quindi potrebbe essere utile a qualcuno da qualche parte;)

1

Quali semantica stai specificando per il vertice-tipo? Sono allineati correttamente con i vertici e anche con lo shader? Se si utilizza una configurazione D3DXVECTOR4, D3DXVECTOR3 (come mostrato nel codice VS), questo potrebbe essere un problema se CreateVertex() restituisce una struttura D3DXVECTOR3, D3DXVECTOR2. Sarebbe rassicurante vedere anche il tuo codice pixel shader.

+0

domanda aggiornato, non abbastanza vedere come è rilevante non è che io non sono stato lavorare in questo ambiente per molto tempo. – Jay

+0

CreateVertex non fa nulla di speciale, restituisce ciò che voglio. L'unica cosa che può essere diversa è che texcoord Z non è utilizzato e in futuro è stato lasciato ad utilizzare gli array di texture. – Jay

+0

L'allineamento è corretto, il passo è il valore corretto di 24 byte, (non un bel multiplo di 16 byte ma dovrebbe funzionare come dx auto pad) – Jay