![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
100 текстур - это круто, возможно чтоит присмотреться к теме array textures (многослойные текстуры).
(glScalef и glRotatef) в принципе написать свой манагер матриц преобразования не так уж сложно, все что нужно так это перед отрисовкой инициалировать нужную юниформу шейдера (глобальную для шейдера константу) посчитанной матрицей преобразования. про отрисовку в тектуру. посмотрел свою писанину. когда-то развлекал себя на тему видео в огл, ничего умнее отрисовки в текстуру не придумал, получилась довольно простая (и слегка бесполезная мурзилка), но в качестве примера сойдет. базовая идея: существует несколько источников видео, каждому из источников присваивается слой многослойной текстуры. ключевой фрейм видео грузится с помощью TexSubImage3D, дельта фреймым отрисовываются шейдером. Последний раз редактировалось f.hump; 29.03.2014 в 18:23. |
![]() |
![]() |
![]() |
#12 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
в теме участвуют два шейдера вершинный (vertex shader) и пиксельный (fragment shader)
vertex shader: Код:
Код:
|
![]() |
![]() |
![]() |
#13 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
ЗЫ. в личных целях переписал стандартные огл хедеры, в большенстве случаев префикс OpenGL:: перед именем функции имеет смысл gl. опять же по личным причинам пользуюсь только core context, никакого compatibility context.
на стороне клиента происходит инициализация контекста: Код:
Дальше был создан и привязан буффер в котором хранятся вершинные аттрибуты (_codo_buf). Надо отметить, что тут были разрешены и сконфигурированны два массива, которые идут на вход вершинного шейдера (pixel_coords и delta_color). в целях личного удобства массивы сделанны iterleaved и хранятся в одном буфере (_codo_buf). первый массив - двух компонентные координаты пикселя (GL_UNSIGNED_SHORT на компоненту), втрой массив - четырехкомпонентные вектора коррекции цвета (GL_BYTE на компоненту) Поскольку отрисовка пранировалась не в default buffer, был создан и привязан FrameBuffer (video_frame). В принципе, после создания контекста текущий текстурный юнит это GL_TEXTURE0, но на всякий случай сделал ActiveTexture(GL_TEXTURE0). (текстурный юнит для текстур имеет такой же смысл как и VAO для аттрибутов: набор состояний и флагов (какой тип текстуры подлючен, имя текстуры и т.п.) да, поскольку не хотелось, чтобы процесс обновления видео фреймов сильно сказывался на отрисовке в основном контексте, на который реагирует юзер, обновление видео фреймов происходит в отдельном потоке и соответственно в другом контексте. по умолчанию, если есть два огл контекста то они имеют назависимые пространства имен для текстур и буферов, т.е. нельзя обратиться к текстуре/буферу в одном контексте по ее/его имени из другого контекста. для обобщения пространства имен на два контекста была произведена операция шары OpenGL::Core::ShareRC(gl_rc), эта процедура делегирует вызов wglShareLists в основной поток, до того как gl_rc стал текущим для видео потока. в video_pass.Initialize() происходит следующее Код:
Последний раз редактировалось f.hump; 29.03.2014 в 22:36. |
![]() |
![]() |
![]() |
#14 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
когда приходит время отрисовки происходит следующее:
Код:
Последний раз редактировалось f.hump; 29.03.2014 в 16:04. |
![]() |
![]() |
![]() |
#15 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]() Код:
вообщем и все. видео действительно рисуется, но по ходу обнаружилось, что отрисовка происходит более эффективно, когда дельта фреймы добавляются на CPU и результат копируется с помощью TexSubImage3D. |
![]() |
![]() |
![]() |
#16 |
Пользователь
Регистрация: 02.04.2013
Сообщений: 51
|
![]()
Всем спасибо за советы. Появился еще такой вопрос. Использую Framebuffer'ы (glGenFrameBuffersEXT) для рисования в текстуру. К буферу присоединена текстура. При установке формата пикселя, когда создаю основной контекст воспроизведения, то задаю ему:
Код:
Код:
Признаюсь, что такой алгоритм придуман в угоду работе с шейдерами, так как, насколько я понял, они работают только с OpenGL'овской системой, но объекты, которые я рисую, имеют оконные координаты. Переводить каждую координату в OpenGL'овскую было бы долго. |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Шейдеры в OpenGL для начинающих. | _PROGRAMM_ | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 12 | 21.12.2020 23:43 |
шейдеры | ser70 | Общие вопросы C/C++ | 2 | 05.11.2014 09:54 |
Шейдеры | Inv1s | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 3 | 28.06.2012 13:46 |
Шейдеры (HLSL) и OpenGL | ImmortalAlexSan | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 3 | 11.04.2012 18:54 |
Шейдеры | _-Re@l-_ | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 7 | 01.08.2010 14:33 |