2013-07-29 2 views
1

Что происходит, когда я устанавливаю байтовое число как объявление вершины в семантике POSITION, а в шейдере я использую unit4 как соответствующий тип данных (потому что байта4 отсутствует).Семантическая проблема определения вершин HLSL

uint4 Test: POSITION0;

и что будет здесь, с поплавком?

float4 Tint: POSTION0;

ответ

2

uint4 верен.

Данные будут преобразованы в 32-битное целое независимо от того, были ли данные буфера вершин 8 бит, 16 бит или 32-битное целое число. То же самое относится к поплавкам, шейдерные сделки в 32-битных поплавках (если вы не используете двойной тип), и любые входные данные преобразуются из его базового формата.

Однако вы не можете преобразовать из integer и float как часть выборки буфера вершин. Вы можете конвертировать между float и integer, как только у вас есть данные, но тип входного атрибута (uint или float) должен соответствовать DXGI_FORMAT, указанному в макете ввода. Если вы попробуете объявить ввод как float4, когда на самом деле это uint4, вы получите предупреждение, подобное этому:

D3D11 WARNING: ID3D11Device::CreateInputLayout: The provided input signature expects to read an element with SemanticName/Index: 'POSITION'/0 and component(s) of the type 'float32'. However, the matching entry in the Input Layout declaration, element[0], specifies mismatched format: 'R8G8B8A8_UINT'. This is not an error, since behavior is well defined: The element format determines what data conversion algorithm gets applied before it shows up in a shader register. Independently, the shader input signature defines how the shader will interpret the data that has been placed in its input registers, with no change in the bits stored. It is valid for the application to reinterpret data as a different type once it is in the vertex shader, so this warning is issued just in case reinterpretation was not intended by the author. [ STATE_CREATION WARNING #391: CREATEINPUTLAYOUT_TYPE_MISMATCH] 
Смежные вопросы