2013-02-26 2 views
1

Есть ли способ установить HLSL (например) вершинную константу шейдера из кода C++ в opengl-стиле? Я имею в виду - нет d3dx, нет постоянного стола. Шейдер уже скомпилирован с помощью fxc.exe и установлен. У вас есть только LPDIRECT3DVERTEXSHADER9 и LPDIRECT3DDEVICE9. Я планировал использовать SetVertexShaderConstant *, но не нашел способа перевести имя константы (например, «u_mvpMatrix») на «Зарегистрировать номер, который будет содержать первое постоянное значение».Способ установки константы HLSL

ответ

1

Вам необходимо привязать свои константы к регистрам в вашем файле шейдера. Например.

float4 sample_constant : register(c12); 

Это связывает sample_constant для регистрации 12. Затем можно использовать SetVertexShaderConstant(), чтобы установить константу, используя 12 для регистра.

+0

Выглядит довольно неудобно по сравнению с OpenGL =/ В любом случае - спасибо за ответ. – mjollneer

+0

Как вы думаете, вы могли бы отметить мой ответ как ответ? :) – alanw

+0

OK. Но на самом деле это не ответ. Скорее всего, вы указали на неприемлемость вопроса. Это не то, что я просил, но что нужно =) – mjollneer

0

Вы можете установить константы по имени, используя API ID3DXConstantTable. Например, если у вас есть постоянная float4 называется cameraPos в вас шейдере вы можете установить его на C/C++ следующим образом:

float val[4] = {0,1,0,1}; 
D3DXHANDLE camposHandle = consttab->GetConstantByName(NULL, "cameraPos"); 
consttab->SetFloatArray(d3ddev, camposHandle, val, 4); 

В этом примере d3ddev является объектом устройства и consttab является ID3DXConstantTable объектом. Вы можете получить этот объект, когда компилируете шейдерный код, используя D3DXCompileShaderFromFile или один из его вариантов.

+0

Это будет работать, но ключевым условием было «no d3dx, no constant-table». – mjollneer

0

С устареванием из D3DX я чувствую многие люди могли бы найти эту тему в поисках решения тех же проблемы, как и И.

Существует действительно способ перевести постоянное имя для регистрации количества, по разбору фактический скомпилированный шейдерный код.

Я нашел тему, которая обсуждает именно это и устанавливает рабочий код, который реализует это, и работает безупречно. Я не хочу, чтобы взять кредит, но связать оригинальный автор, так извинениями за «просто» разместить ссылку на тему на GameDev.net:

http://www.gamedev.net/topic/648016-replacement-for-id3dxconstanttable/#entry5095598

Это решение является именно то, что ОП спрашивал а не «обходным путем».

Смежные вопросы