C ++着色器,HLSL,如何发送到着色器,纹理? “sampler2d”?

时间:2011-11-15 13:40:08

标签: c++ directx textures shader hlsl

我开始学习一些使用C ++和HLSL的Shader操作,我正在使用 D3DXCompileShaderFromFile 在学习的同时做一些测试

我能够编译并运行一些VertexShader和PixelShader,发送一些属性,比如 float,float2,float3,float4,float4x4,设置worldMatrix,颜色信息等,这里有一些例子:

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

但是我遇到了一个问题,那就是使用Basic Light着色器

如何将纹理发送到我的“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;

}

2 个答案:

答案 0 :(得分:3)

难道你不需要正常绑定纹理吗?不熟悉directx api,因为我通常使用Ogre,但快速查找建议SetTexture(sampler, texture)是要走的路,采样器是采样器寄存器。 如果需要,您可以明确说明纹理在着色器中使用的寄存器。

答案 1 :(得分:0)

谢谢Pete!,我快速浏览一下像你说的SetTexture(采样器,纹理)文档,我能够弄清楚该怎么做,我做了这个新的二传手

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

前:

myShader->SetTexture("baseMap");

并且不知何故,它有效,我不太清楚为什么,因为我向“SetTexture”属性发送一个空的“纹理”