Собственно вопрос в названии, что происходит какое-то связывание шейдера и описания вершин? (в direct 9 такого не было)
Если я хочу генерировать формат вершин на ходу, то это значит что я должен хранить помимо самого ID3D11VertexShader еще и ID3DBlob ?
Ниже пример отсюда http://d3dbegin.narod.ru/dx11tutorial02.htm
// Компиляция вершинного шейдера из файла ID3DBlob* pVSBlob = NULL; // Вспомогательный объект - просто место в оперативной памяти CompileShaderFromFile(L"urok6.fx", "VS", "vs_4_0", &pVSBlob ); // Создание вершинного шейдера hr = g_pd3dDevice->CreateVertexShader( pVSBlob->GetBufferPointer( ), pVSBlob->GetBufferSize( ), NULL, &g_pVertexShader ); // Определение шаблона вершин D3D11_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = ARRAYSIZE( layout ); // Создание шаблона вершин g_pd3dDevice->CreateInputLayout( layout, numElements, pVSBlob->GetBufferPointer( ), pVSBlob->GetBufferSize( ), &g_pVertexLayout); pVSBlob->Release( );
так хочет Microsoft :)
Тоже вымораживает эта хрень.
А вот в ихней хне такого маразма нет.
Судя по документации, шейдер используется для проверки соответствия форматов. При этом программер имеет право игнорировать выдаваемое предупреждение.
Можно попробовать сделать специальный мусорный шейдер и совать его везде. :)
Steex
> и совать его везде.
OK
stm32
> Если я хочу генерировать формат вершин на ходу
Слабо представляю себе зачем это может понадобиться.
Steex
> Можно попробовать сделать специальный мусорный шейдер и совать его везде. :)
Вот это, кстати, вполне возможно. Но, скорее всего, дебажный режим будет сильно недоволен.
stm32
> в direct 9 такого не было)
nes
> А вот в ихней хне такого маразма нет.
потому что хня на direct 9 написяна
Спс всем
вообщем сделал так:
enum ShaderType : unsigned int { VertexShader, PixelShader } class MyShader { ID3D11VertexShader* v; ID3D11PixelShader* p; ID3DBlob* blop; ShaderType type; } class MyInputLayout { ID3D11InputLayout* a; } class MyEngineDevice { void CreateShaderFromFile(MyShader** pShader, const char* path, const char* mFunc, const char* shaderModel); void CreateInputLayout( MyInputLayout** layout, MyShader* shader); }
0r@ngE
> Слабо представляю себе зачем это может понадобиться.
Например, во всяких редакторах материалов.
stm32
Кстати, а что происходит, если null передать?
Steex
> Кстати, а что происходит, если null передать?
ф-я вернет HRESULT с таким содержанием "E_INVALIDARG One or more arguments are invalid."
stm32
> ф-я вернет HRESULT с таким содержанием "E_INVALIDARG One or more arguments are invalid."
Жаль. Я подумал - чем черт не шутит, может аргумент опциональный. :)
Steex
> Например, во всяких редакторах материалов.
А зачем в редакторе материала менять vertex layout ?
Ну если вдруг сильно хочется - то можно генерить шейдер на лету
shaderText << your_awesome_vs_input_structure_definition << "float4 main(const VSInput IN) : SV_Position { return float4(0,0,0,0); }";
Но я, все же, вижу редактор материалов с одним фиксированным жирным вертекс лайаутом, а материал просто решает что из этого юзать.
А уже на этапе кукинга данных генерить нужные лайауты.
правил опечатку
0r@ngE
А если материал программируемый, или строится на манер blueprints из UE? Шейдер тогда в любом случае генерится на лету.
Тема в архиве.
Тема закрыта.