Как сделать смешивание текстур в Direct3D 10?

До сих пор я обнаружил, что вам нужно создать объект ID3D10BlendState, вызвать CreateBlendState () со структурой D3D10_BLEND_DESC и вызвать OMSetBlendState (). Но я не знаю, как вызывать функции Draw () и как применять () текстуры. У меня есть текстуры световых карт, которые мне нужно смешать с обычными текстурами. Нужно ли несколько текстурных координат для вершин? Нужно ли рисовать каждый поли дважды, один раз для текстуры и один раз для карты освещения? Я также не очень хочу использовать массивы текстур.

Заранее спасибо.

-1

Решение

Нет причин использовать 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 который использует шейдер выше.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector