ПрограммированиеФорумГрафика

Почему в CreateInputLayout() я должен передавать указатель на скомпилированный шейдер ?

#0
14:39, 13 дек 2018

Собственно вопрос в названии, что происходит какое-то связывание шейдера и описания вершин? (в 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();
#1
15:01, 13 дек 2018

так хочет Microsoft :)

#2
15:37, 13 дек 2018

Тоже вымораживает эта хрень.
А вот в ихней хне такого маразма нет.

#3
16:14, 13 дек 2018

Судя по документации, шейдер используется для проверки соответствия форматов. При этом программер имеет право игнорировать выдаваемое предупреждение.
Можно попробовать сделать специальный мусорный шейдер и совать его везде. :)

#4
16:15, 13 дек 2018

Steex
> и совать его везде.

OK

#5
17:42, 13 дек 2018

stm32
> Если я хочу генерировать формат вершин на ходу
Слабо представляю себе зачем это может понадобиться.

Steex
> Можно попробовать сделать специальный мусорный шейдер и совать его везде. :)
Вот это, кстати, вполне возможно. Но, скорее всего, дебажный режим будет сильно недоволен.

#6
17:56, 13 дек 2018

stm32
> в direct 9 такого не было)
nes
> А вот в ихней хне такого маразма нет.

потому что хня на direct 9 написяна

#7
18:08, 13 дек 2018

Спс всем
вообщем сделал так:

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);
}
#8
18:34, 13 дек 2018

0r@ngE
> Слабо представляю себе зачем это может понадобиться.
Например, во всяких редакторах материалов.

stm32
Кстати, а что происходит, если null передать?

#9
18:49, 13 дек 2018

Steex
> Кстати, а что происходит, если null передать?
ф-я вернет HRESULT с таким содержанием "E_INVALIDARG One or more arguments are invalid."

#10
18:59, 13 дек 2018

stm32
> ф-я вернет HRESULT с таким содержанием "E_INVALIDARG One or more arguments are invalid."
Жаль. Я подумал - чем черт не шутит, может аргумент опциональный. :)

#11
19:00, 13 дек 2018

Steex
> Например, во всяких редакторах материалов.
А зачем в редакторе материала менять vertex layout ?

Ну если вдруг сильно хочется - то можно генерить шейдер на лету

shaderText << your_awesome_vs_input_structure_definition << "float4 main(const VSInput IN) : SV_Position { return float4(0,0,0,0); }";

Но я, все же, вижу редактор материалов с одним фиксированным жирным вертекс лайаутом, а материал просто решает что из этого юзать.
А уже на этапе кукинга данных генерить нужные лайауты.

правил опечатку

#12
19:25, 13 дек 2018

0r@ngE
А если материал программируемый, или строится на манер blueprints из UE? Шейдер тогда в любом случае генерится на лету.

ПрограммированиеФорумГрафика

Тема в архиве.

Тема закрыта.