ncuxonaT
> Почему для анимированных спрайтов и прочего подобного, как правило, используют
> 2д текстуру с атласом, а не 3д текстуру? Есть какие-то подводные камни?
В атласе можно хранить спрайты разного размера.
ncuxonaT
3d текстура с допущениями это нарезанная на равные куски 2d текстура, только ты еще будешь должен тратить доп. координату для индексации не говоря о том что если свободное место не тратится на 100%, то будут расти издержки по эффективности использования свободного места. При этом никаких преимуществ которые дает 3d текстура для спрайтов особо не использовать, а там где они будут нужны, то почему бы и нет. Какие нибудь эффекты в которых нужны плавные переходы использование 3d текстуры вполне оправдано.
ncuxonaT
Не поверишь
В рендере втылуврага так и делали анимацию в 3д текстуре
Самбыл в шоке :)
ncuxonaT
> Почему для анимированных спрайтов и прочего подобного, как правило, используют
> 2д текстуру с атласом, а не 3д текстуру? Есть какие-то подводные камни?
А зачем там 3д текстура, если всё в 2д влезает? Или речь идёт от массиве текстур, а не 3д текстуре?
stratego
> А зачем там 3д текстура, если всё в 2д влезает? Или речь идёт от массиве
> текстур, а не 3д текстуре?
Чтобы был плавный переход между кадрами, чтобы вся анимация свелась к подстановке времени в третью текстурную координату, чтобы мипы меньше занимали (1/3 для 2д и 1/7 для 3д)
Я не думал про это... интересно. Есть где почитать про это подробнее?
Я таки добрался до OpenGL 3.3
Я уже меньший ретроград и луддит, просто держу вас в курсе:)
Мои поздравления! А как же устаревший функционал? )))
Mirrel
> Мои поздравления! А как же устаревший функционал? )))
Для рендера OpenGL 3.3 устаревший функционал не использую, только функционал 3 версии.
Вообще идея такая: Сделать 4 рендера.
OpenGL 1.0 (Готово)
OpenGL 2.0 (Не приступал)
OpenGL 3.0 (В процессе)
OpenGL 4.0 (Не приступал)
Функционал выше пользователь сам инициализирует, если он ему нужен. К примеру Пользователь решит использовать OpenGL 3.3. Тогда он выбирает рендер OpenGL 3.0 (выбирается #define для проекта) и для доступности функционала 3.1, 3.2, 3.3 использует #include <LDL/OpenGL/OpenGL_3_1>, <LDL/OpenGL/OpenGL_3_2>, <LDL/OpenGL/OpenGL_3_3>
Весь функционал загружается динамически.
Пример: Базовая версия всегда x.0 расширения инициализируются динамически.
else if (Equal( 3, 1)) { Init_3_0( ); Init_3_1( ); } else if ( Equal( 3, 2)) { Init_3_0( ); Init_3_1( ); Init_3_2( ); } else if ( Equal( 3, 3)) { Init_3_0( ); Init_3_1( ); Init_3_2( ); Init_3_3( ); }
else if (Equal( 1, 3)) { Init_1_0( ); Init_1_1( ); Init_1_2( ); Init_1_3( ); }
Такая идея.
Как это выглядит в коде
#include <iostream> #include <LDL/Core/RuntimeError.hpp> #include <LDL/Time/FpsCounter.hpp> #include <LDL/Core/IntegerToString.hpp> #include <LDL/Graphics/Window.hpp> #include <LDL/Graphics/Render.hpp> #include <LDL/OpenGL/OpenGLLoader.hpp> #include <LDL/OpenGL/OpenGL3_3.hpp> //Включает все заголовки OpenGL3_0, OpenGL3_1, OpenGL3_2 using namespace LDL::Graphics; int main() { try { //Пользователю доступен OpenGL 3.0, но если ему нужен именно 3.3 его нужно инициализировать LDL::OpenGLLoader openGLLoader( 3, 3); Window window( Point2u( 0, 0), Point2u( 800, 600), "Window!"); Render render( &window); LDL::Events::Event report; LDL::Time::FpsCounter fpsCounter; LDL::Core::IntegerToString convert; while ( window.GetEvent( report)) { fpsCounter.Start( ); render.Begin( ); render.End( ); if ( report.Type == LDL::Events::IsQuit) { window.StopEvent( ); } if ( fpsCounter.Calc( )) { window.Title( convert.Convert( fpsCounter.Fps( ))); fpsCounter.Clear( ); } } } catch ( const LDL::Core::RuntimeError& error) { std::cout << error.what( ) << '\n'; } return 0; }
JordanCpp
Исключения? Нуну
innuendo
> Исключения? Нуну
Почему нет?
Смотрел 16 битный MFC для Windows 3.1, так там тоже исключения.
Производительность процессоров с того времени, чуть подросла, могу себе позволить:)
Ситуация: в пиксельном шейдере приходится находить трансформацию (уникальную для фрагмента) и применять ее к двум-трем 4D-векторам.
Само преобразование состоит из трех некоммутирующих поворотов, синусы/косинусы для которых находятся очень просто.
Вопрос, как выгоднее для GPU:
- строить матрицу 4х4 (в пиксельном шейдере!) и потом ее применять
- или просто каждый вектор три раза модифицировать обычными поворотными формулами
coord1' = cos*coord1 - sin*coord2
coord2' = sin*coord1 + cos*coord2
?
Если считать по количеству отдельных операций умножения и сложения для построения матрицы и для ее применения, то вариант без матрицы раза в два выгоднее. Но если для всех этих векторно-матричных умножений в каждом ядре GPU специализированные модули, то вариант на "рассыпухе" будет хуже.
Dmitry_Milk
> Но если для всех этих векторно-матричных умножений в каждом ядре GPU специализированные модули
Давно уже нет.
}:+()___ [Smile]
> Давно уже нет
Ну я тоже так подозреваю, что устройство каждого ядра GPU упрощено в пользу количества ядер, но мало ли...
Dmitry_Milk
> Ну я тоже так подозреваю, что устройство каждого ядра GPU упрощено в пользу
> количества ядер, но мало ли...
Замерь да сравни, вроде же не так уж и затратно.