Есть ли способ установить HLSL (например) вершинную константу шейдера из кода C++ в opengl-стиле? Я имею в виду - нет d3dx, нет постоянного стола. Шейдер уже скомпилирован с помощью fxc.exe и установлен. У вас есть только LPDIRECT3DVERTEXSHADER9 и LPDIRECT3DDEVICE9. Я планировал использовать SetVertexShaderConstant
*, но не нашел способа перевести имя константы (например, «u_mvpMatrix») на «Зарегистрировать номер, который будет содержать первое постоянное значение».Способ установки константы HLSL
ответ
Вам необходимо привязать свои константы к регистрам в вашем файле шейдера. Например.
float4 sample_constant : register(c12);
Это связывает sample_constant для регистрации 12. Затем можно использовать SetVertexShaderConstant(), чтобы установить константу, используя 12 для регистра.
Вы можете установить константы по имени, используя 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 или один из его вариантов.
Это будет работать, но ключевым условием было «no d3dx, no constant-table». – mjollneer
С устареванием из D3DX я чувствую многие люди могли бы найти эту тему в поисках решения тех же проблемы, как и И.
Существует действительно способ перевести постоянное имя для регистрации количества, по разбору фактический скомпилированный шейдерный код.
Я нашел тему, которая обсуждает именно это и устанавливает рабочий код, который реализует это, и работает безупречно. Я не хочу, чтобы взять кредит, но связать оригинальный автор, так извинениями за «просто» разместить ссылку на тему на GameDev.net:
http://www.gamedev.net/topic/648016-replacement-for-id3dxconstanttable/#entry5095598
Это решение является именно то, что ОП спрашивал а не «обходным путем».
- 1. Место установки фиксированного освещения HLSL
- 2. Каков правильный способ установки глобальных параметров в hlsl-шейдере?
- 3. HLSL: принудительное ограничение лимита константы во время компиляции
- 4. Почему значение константы влияет на компиляцию шейдеров HLSL?
- 5. Странный способ объявления переменных в hlsl
- 6. Значение установки для константы const unsigned int
- 7. Компилятор Elides Назначение константы без установки переменной
- 8. Идеальный способ организовать Java-константы
- 9. Каков правильный способ добавления константы?
- 10. Hardcoding HLSL Shader
- 11. HLSL float4x4 отдельные поплавки
- 12. HLSL Swizzle - in C#
- 13. DirectX 9 HLSL против DirectX 10 HLSL: синтаксис такой же?
- 14. Способ устранения деформации видеопроектора с помощью полноэкранного шейдера GLSL/HLSL
- 15. Лучший способ реализовать PHP-константы в Javascript
- 16. Как получить доступ константы ни статический способ
- 17. Ruby Constants есть способ иметь реальные константы ..?
- 18. Способ сохранения результата функции в качестве константы
- 19. Лучший способ сохранить константы в android
- 20. Каков наилучший способ представления константы в YAML?
- 21. Лучший способ определить константы в Objective-C
- 22. Правильный способ добавления константы в класс
- 23. Угловых 2, правильный способ реализации константы
- 24. Правильный способ установки ORACLE_HOME?
- 25. Постепенный способ установки Matplotlib
- 26. Способ установки кнопки изображения
- 27. правильного способ установки PYTHONPATH
- 28. Автоматический способ установки vsyasm
- 29. Обозначение константы константы C++
- 30. Управление эффектами HLSL
Выглядит довольно неудобно по сравнению с OpenGL =/ В любом случае - спасибо за ответ. – mjollneer
Как вы думаете, вы могли бы отметить мой ответ как ответ? :) – alanw
OK. Но на самом деле это не ответ. Скорее всего, вы указали на неприемлемость вопроса. Это не то, что я просил, но что нужно =) – mjollneer