2012-07-26 12 views
5

utilizzando questo codice posso inviare una texture per lo shader:Directx 11, inviare più texture nello Shader

devcon->PSSetShaderResources(0, 1, &pTexture); 

Naturalmente ho fatto la pTexture da: D3DX11CreateShaderResourceViewFromFile

Shader: Texture2D struttura;

return color * Texture.Sample(ss, texcoord); 

sto attualmente solo l'invio di un tessuto allo shader, ma vorrei inviare più texture, come è possibile?

Grazie.

+0

stai provando a fare fusione/multi-texturing? –

risposta

7

Utilizzando Texture Arrays. Quando compili il tuo look D3D11_TEXTURE2D_DESC al membro ArraySize. Questa descrizione è quella che viene passata a ID3D11Device::CreateTexture2D. Quindi nello shader utilizzi un terzo indice di campionamento texcoord che indica quale trama 2D nella matrice a cui ti stai riferendo.

Aggiornamento: Ho appena realizzato si potrebbe parlare di farlo più chiamate multiple (vale a dire per diverse aree geo), nel qual caso si aggiorna visualizzazione delle risorse consistenza dello shader. Se si utilizza la struttura degli effetti, è possibile utilizzare ID3DX11EffectShaderResourceVariable::SetResource o, in alternativa, riassociare una nuova trama utilizzando PSSetShaderResources. Tuttavia, se si sta tentando di fondere tra più trame, è necessario utilizzare matrici di trama.

Si potrebbe anche voler esaminare trame 3D, che forniscono un modo naturale per interpolare tra trame adiacenti nell'array (mentre gli array 2D vengono automaticamente bloccati al numero intero più vicino) tramite il terzo elemento nel texcoord. Vedi HLSL sampleremarks.

+0

Interessante, mal provarlo ... –

+0

Solo una domanda, come posso scegliere se voglio unirmi, quindi voglio solo unirmi in alcune situazioni? Disabilito il secondo texcoord? –

+0

Non uso la struttura degli effetti. –

14

È possibile utilizzare più trame purché il loro conteggio non superi le specifiche del proprio profilo shader. Ecco un esempio: Codice HLSL:

Texture2D diffuseTexture : register(t0); 
Texture2D anotherTexture : register(t1); 

codice C++:

devcon->V[P|D|G|C|H]SSetShaderResources(texture_index, 1, &texture); 

Così, per esempio per il codice HLSL sopra di esso sarà:

devcon->PSSetShaderResources(0, 1, &diffuseTextureSRV); 
devcon->PSSetShaderResources(1, 1, &anotherTextureSRV); (SRV stands for Shader Texture View) 

O:

ID3D11ShaderResourceView * textures[] = { diffuseTextureSRV, anotherTextureSRV}; 
devcon->PSSetShaderResources(0, 2, &textures); 

I nomi HLSL possono essere arbi trary e non deve corrispondere a nessun nome specifico - solo gli indici contano. Mentre "register (tXX);" non sono richieste dichiarazioni, ti consiglio di usarle per evitare confusione su quale texture corrisponda a quale slot.

+0

* (SRV sta per Shader Resource View) – d7samurai