2011-11-15 13 views
0

イム、イム私は、 フロートのように、するfloat2いくつかの属性を送って、いくつかのVertexShaderとPixelShaderをコンパイルして実行することができましたC++シェーダ、HLSL、シェーダに送る方法、テクスチャ? "sampler2d"? C++とHLSL witg一部のシェーダー操作を学習開始

を勉強しながら、いくつかのテストを行うにはD3DXCompileShaderFromFileを使用して、worldMatrix、色情報などを設定するためにするfloat3、のfloat4、するfloat4x4は、ここにいくつかの例です:

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); 
} 

SetMatrixとSetFloatとほぼ同じもの、例:

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

基本的なライトシェーダの基本的なシェーダ

「pixelShader」にテクスチャを送信するにはどうすればよいですか?私のPSで「sampler2d」型として宣言、そう

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; 

} 

答えて

3

は、あなただけの通常通りのテクスチャをバインドする必要はありません。この情報を送信するために使用するかわからないイムされて?私が通常Ogreを使用しているのでdirectx apiに精通していませんが、サンプラーがサンプラー・レジスターになっているので、すばやく検索するとSetTexture(sampler, texture)が行く方法です。 必要に応じて、テクスチャがシェーダで使用するレジスタを明示的に指定することができます。あなたが言ったように、ピートは!、私はSetTexture(サンプラー、テクスチャ)のドキュメントに簡単に見て取って、私は何をすべきかを把握することができました

0

おかげで、私は

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"); 

と何とか、それは私が「SetTexture」プロパティに送信するので、空の「質感」

+0

がNULLテクスチャから離れて合理的なルックス、なぜイムはかなり確実ではない、動作します。あなたが望むテクスチャを実際に取得している場合は、GPUに別の場所に送る必要がありますが、それはある種の流行です。 – Pete

関連する問題