C ++ шейдер, HLSL, как отправить в шейдер текстуру? "Sampler2D"? - PullRequest
0 голосов
/ 15 ноября 2011

я начинаю изучать некоторые манипуляции с шейдерами с помощью C ++ и HLSL, я использую 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 shader

как я могу отправить текстуру моему "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 ]

3 голосов
/ 15 ноября 2011

Разве вам просто не нужно связывать текстуру как обычно? Не знаком с DirectX API, поскольку я обычно использую Ogre, но быстрый поиск подсказывает, SetTexture (сэмплер, текстура) - путь, с сэмплером это регистр сэмплера. Вы можете явно сказать, какой регистр использует текстура в шейдере, если хотите.

0 голосов
/ 16 ноября 2011

Спасибо, Пит! Я быстро взглянул на документацию 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);
}

ex:

myShader->SetTexture("baseMap");

и каким-то образом это работает, я не совсем уверен, почему, потому что я посылаю свойству "SetTexture" пустую "текстуру"

...