| PMG https://forum.pmg.org.ru/ |
|
| Вопрос по анимации и по шейдерам https://forum.pmg.org.ru/viewtopic.php?f=2&t=473 |
Страница 1 из 1 |
| Автор: | Xadja [ 02 июн 2006 15:25 ] |
| Заголовок сообщения: | Вопрос по анимации и по шейдерам |
Возникло два вопроса: 1. Например, я запускаю шарик, который крутится вокруг оси Y, при увеличении частоты кадров, увеличивается скорость вращения. Как сделать, чтобы вращение не зависило от частоты кадров. 2. Возможно ли вместо родных трансформаций, типа device.Transform использовать шейдеры для трансформации объектов, и если можно, то какой из способов будет быстрее работать. И еще, можно ли писать шейдеры непосредственно в программе? |
|
| Автор: | MagicWolf [ 02 июн 2006 16:03 ] |
| Заголовок сообщения: | |
1. Сделай чтобы скорость вращения зависала от прошедшего времени. angle=speed*dif_time 2. Я думаю трансформацию можно, но в DX шейдеры динамически в проге создавать нельзя. |
|
| Автор: | Xadja [ 02 июн 2006 16:18 ] |
| Заголовок сообщения: | |
1. Я делаю вот так: angle = (float)timer.GetTime(); lightPos *= OTMath.Matrix4.RotationYawPitchRoll(angle,0,0); world= OTMath.Matrix4.Moving(lightPos); lightEf.SetValue("world", world); view = Matrix.LookAtLeftHanded(new Vector3(0, 0, -500), new Vector3(0, 0, 0), new Vector3(0, 1, 0)); proj = Matrix.PerspectiveFieldOfViewLeftHanded((float)Math.PI / 3, 1.33f, 1.0f, 5000.0f); Matrix worldviewproj = world*view * proj; lightEf.SetValue("matViewProjection", worldviewproj); и у меня с каждым кругом растет скорость вращения света вокруг объекта...
2. Так трансформации через шейдеры будут быстрее работать, или нужно будет тестить? |
|
| Автор: | NetLib [ 02 июн 2006 18:38 ] |
| Заголовок сообщения: | |
Цитата: 2. Возможно ли вместо родных трансформаций, типа device.Transform использовать шейдеры для трансформации объектов, и если можно, то какой из способов будет быстрее работать. И еще, можно ли писать шейдеры непосредственно в программе?
Можно. Вот пример шейдера, который выполняет трансформацию. // Матрица преобразования. Инициализируем ее из приложения matrix ViewProjMatrix; // // Структуры // // Входная структура описывает вершины, которые будут // передаваться в шейдер. Здесь входная вершина содержит // только данные о местоположении. struct VS_INPUT { vector position : POSITION; }; // Выходная структура описывает вершину, которая // возвращается шейдером. Здесь выходная вершина // содержит данные о местоположении struct VS_OUTPUT { vector position : POSITION; }; // // Собственно шейдер // VS_OUTPUT Main(VS_INPUT input) { // Обнуляем данные выходной вершины VS_OUTPUT output = (VS_OUTPUT)0; // Преобразование output.position = mul(input.position, ViewProjMatrix); // Возвращаем преобразованную вершину return output; } Соответственно мы можете динамически генерировать код шейдера в программе (в виде текстовой строки), а затем из программы же компилировать его. |
|
| Автор: | Xadja [ 02 июн 2006 18:59 ] |
| Заголовок сообщения: | |
NetLib, да, это я знаю, но будет этот метод работать быстрее, или все равно? всмысле генерить в программе? просто загружать из файла? |
|
| Автор: | NetLib [ 02 июн 2006 22:33 ] |
| Заголовок сообщения: | |
Цитата: будет этот метод работать быстрее, или все равно? А вот этого я не знаю. Надо замерять. Цитата: всмысле генерить в программе? просто загружать из файла?
Можно загружать из файла, а можно программно создать строку, содержащую код шейдера на HLSL и скомпилировать ее. То есть у вас есть некоторые заготовки Например str1 = "VS_OUTPUT Main(VS_INPUT input) \n{\nVS_OUTPUT output = (VS_OUTPUT)0; \n"; str2 = "output.position = mul(input.position, ViewProjMatrix);\n"; str3 = "return output; \n}\n"; Ну и так далее. Потом из этих кубиков в программе формируем нужный шейдер shader = str1 + str2 + str3; Ну это я привел простейший вариант, а так строка будет собираться в зависимости от каких-то условий. Затем компилим эту строку функцией D3DXCompileShader и используем скомпилированный шейдер при визуализации. |
|
| Автор: | NetLib [ 02 июн 2006 22:35 ] |
| Заголовок сообщения: | |
То есть шейдеры можно компилировать из трех источников: 1. Обычная строка символов. 2. Текстовый файл. 3. Ресурсы программы |
|
| Автор: | MagicWolf [ 05 июн 2006 09:04 ] |
| Заголовок сообщения: | |
Xadja писал(а): 1. Я делаю вот так: lightPos *= OTMath.Matrix4.RotationYawPitchRoll(angle,0,0); А lightPos ты перед этим обнуляешь? Xadja писал(а): 2. Так трансформации через шейдеры будут быстрее работать, или нужно будет тестить?
Не думаю, что это будет сильно быстрее. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|