До сих пор я обнаружил, что вам нужно создать объект ID3D10BlendState, вызвать CreateBlendState () со структурой D3D10_BLEND_DESC и вызвать OMSetBlendState (). Но я не знаю, как вызывать функции Draw () и как применять () текстуры. У меня есть текстуры световых карт, которые мне нужно смешать с обычными текстурами. Нужно ли несколько текстурных координат для вершин? Нужно ли рисовать каждый поли дважды, один раз для текстуры и один раз для карты освещения? Я также не очень хочу использовать массивы текстур.
Заранее спасибо.
Нет причин использовать DirectX 10. DirectX 11 полностью вытесняет его на всех одинаковых платформах (Windows Vista SP2 или более поздние версии поддерживают DirectX 11) и поддерживает более широкий диапазон видеооборудование. Кроме того, единственное место, где можно найти образцы DirectX 10 и код утилиты, — это устаревшее DirectX SDK. Для DirectX 11 существует множество замены с открытым исходным кодом для старого не рекомендуется D3DX
библиотека, а также образцы.
Direct3D 10 и более поздние версии используют программируемые шейдеры, а не устаревший конвейер с «фиксированной функцией». Следовательно, способ, которым вы бы реализовали отображение света в пиксельном шейдере, написанном на HLSL:
Texture2D<float4> Texture : register(t0);
Texture2D<float4> Texture2 : register(t1);
sampler Sampler : register(s0);
sampler Sampler2 : register(s1);
float4 PSDualTextureNoFog(PSInputTx2NoFog pin) : SV_Target0
{
float4 color = Texture.Sample(Sampler, pin.TexCoord);
float4 overlay = Texture2.Sample(Sampler2, pin.TexCoord2);
color.rgb *= 2;
color *= overlay * pin.Diffuse;
return color;
}
Вы бы построили это в автономном режиме с FXC
а затем связать его во время выполнения вместе с вершинным шейдером. Обычно для карт освещения вы используете два набора координат текстуры во входном макете:
const D3D11_INPUT_ELEMENT_DESC VertexPositionDualTexture::InputElements[] =
{
{ "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
Хорошее место, чтобы начать с кодирования C ++ для DirectX 11 — это Набор инструментов DirectX. Включает в себя
DualTextureEffect
который использует шейдер выше.
Других решений пока нет …