2011-11-15 3 views
0

im à partir apprendre une manipulation Shader WITG C++ et HLSL, im en utilisant D3DXCompileShaderFromFile pour faire des tests tout en apprendsShader C++, HLSL, comment envoyer au shader, la texture? "sampler2d"?

j'ai pu compiler et exécuter certains VertexShader et PixelShader, envoyer des attributs, comme flotteur, float2 , float3, float4, float4x4, pour définir WorldMatrix, informations couleur, etc, voici quelques exemples:

void CShader::SetVector4(char name[], Vect4f vect) 
{ 
D3DXVECTOR4 v(vect.x,vect.y,vect.z,vect.w); 
D3DXHANDLE h = m_pConstantTable->GetConstantByName(NULL, name); 
m_pConstantTable->SetVector(m_pDevice, h, &v); 
} 

presque la même chose avec SetMatrix et SetFloat, ex:

myShader->SetVector4("Diffuse",Vect4f(1.0f,0.0f,0.0f,1.0f)); 

mais j'ai couru à un problème de faire ainsi Basic Light shader

comment puis-je envoyer une texture à mon "pixelShader"? dans mon ps est déclarée en tant que type « sampler2D », donc je ne suis pas sûr de ce à utiliser pour envoyer ces informations

float4 Diffuse; 
float4 Ambient; 
sampler2D baseMap; 


float4 Main(float3 L: TEXCOORD0, float3 N: TEXCOORD1,float2 texCoord: TEXCOORD2) : COLOR 
{ 
    float facingRatio = dot(L, N); 
    float4 tex = tex2D(baseMap, texCoord); 

    return tex * Diffuse * facingRatio + Ambient * tex; 

} 

Répondre

3

Ne pas vous juste besoin de lier la texture comme normale? Je ne suis pas familier avec le directx api car j'utilise normalement Ogre, mais la recherche rapide suggère que SetTexture(sampler, texture) est le chemin à parcourir, avec sampler étant le registre de l'échantillonneur. Vous pouvez indiquer explicitement quel registre la texture utilise dans le shader si vous le souhaitez.

0

Merci Pete !, j'ai pris un coup d'œil sur la documentation SetTexture (sampler, texture) comme vous avez dit, et j'ai pu comprendre ce qu'il faut faire, je l'ai fait ce nouveau compositeur

void CShader::SetTexture(char name[]) 
{ 
    IDirect3DBaseTexture9* texture = NULL; 
    D3DXHANDLE h = m_pConstantTable->GetConstantByName(NULL, name); 

    int tex_idx = m_pConstantTable->GetSamplerIndex(h); 

    m_pDevice->SetTexture(tex_idx, texture);  
    m_pDevice->SetSamplerState(tex_idx, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); 
    m_pDevice->SetSamplerState(tex_idx, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); 
    m_pDevice->SetSamplerState(tex_idx, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 
} 

ex:

myShader->SetTexture("baseMap"); 

et d'une certaine manière, cela fonctionne, je ne suis pas tout à fait sûr pourquoi, parce que j'envoie la propriété « SetTexture » un vide « texture »

+0

Attend part raisonnable de la texture NULL. Si vous obtenez réellement la texture que vous voulez, vous devez l'envoyer au GPU ailleurs et c'est une sorte de coup de chance. – Pete

Questions connexes