PMG

Форумы по созданию игр
Текущее время: 29 мар 2024 00:23

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос по анимации и по шейдерам
СообщениеДобавлено: 02 июн 2006 15:25 
Не в сети
Любитель

Зарегистрирован: 01 июн 2006 17:49
Сообщения: 43
Откуда: Kiev
Возникло два вопроса:
1. Например, я запускаю шарик, который крутится вокруг оси Y, при увеличении частоты кадров, увеличивается скорость вращения. Как сделать, чтобы вращение не зависило от частоты кадров.

2. Возможно ли вместо родных трансформаций, типа device.Transform использовать шейдеры для трансформации объектов, и если можно, то какой из способов будет быстрее работать. И еще, можно ли писать шейдеры непосредственно в программе?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 июн 2006 16:03 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
1. Сделай чтобы скорость вращения зависала от прошедшего времени. angle=speed*dif_time
2. Я думаю трансформацию можно, но в DX шейдеры динамически в проге создавать нельзя.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 июн 2006 16:18 
Не в сети
Любитель

Зарегистрирован: 01 июн 2006 17:49
Сообщения: 43
Откуда: Kiev
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. Так трансформации через шейдеры будут быстрее работать, или нужно будет тестить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 июн 2006 18:38 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
Цитата:
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;
}

Соответственно мы можете динамически генерировать код шейдера в программе (в виде текстовой строки), а затем из программы же компилировать его.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 июн 2006 18:59 
Не в сети
Любитель

Зарегистрирован: 01 июн 2006 17:49
Сообщения: 43
Откуда: Kiev
NetLib,

да, это я знаю, но будет этот метод работать быстрее, или все равно?

всмысле генерить в программе? просто загружать из файла?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 июн 2006 22:33 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
Цитата:
будет этот метод работать быстрее, или все равно?


А вот этого я не знаю. Надо замерять.

Цитата:
всмысле генерить в программе? просто загружать из файла?


Можно загружать из файла, а можно программно создать строку, содержащую код шейдера на 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 и используем скомпилированный шейдер при визуализации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 июн 2006 22:35 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
То есть шейдеры можно компилировать из трех источников:
1. Обычная строка символов.
2. Текстовый файл.
3. Ресурсы программы


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 05 июн 2006 09:04 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Xadja писал(а):
1. Я делаю вот так:
lightPos *= OTMath.Matrix4.RotationYawPitchRoll(angle,0,0);


А lightPos ты перед этим обнуляешь?

Xadja писал(а):
2. Так трансформации через шейдеры будут быстрее работать, или нужно будет тестить?


Не думаю, что это будет сильно быстрее.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB