Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 18.08.2013, 02:30   #91
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: OpenGL

Как передать в шейдер множество текстур?
У меня есть большой массив vertexData, в котором хранятся координаты вертексов и координаты текстуры. Рисуется это всё дело за один glDrawArrays(верно ли?). И мне нужно на каждую пару треугольников(квад) наложить свою текстуру. Как это лучше всего сделать?
(Offline)
 
Ответить с цитированием
Старый 18.08.2013, 06:12   #92
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: OpenGL

GL_ARB_BINDLESS_TEXTURE - лучший вариант, но ето только на кеплере и выше. Тут у каждого пикселя может быть своя текстура, что очень круто. Тебе нужно будет лишь добавить к вершине аттрибут - 64битный хэндл текстуры на гпу.

если текстуры одинаковые по формату и размеру - texture array.

если разные - пакуй в атлас.

вообще последний вариант самый неприхотливый
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
Gector (18.08.2013), Nikich (18.08.2013)
Старый 18.08.2013, 18:40   #93
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: OpenGL

А как быть с контекстом постарее?
(Offline)
 
Ответить с цитированием
Старый 18.08.2013, 19:22   #94
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: OpenGL

атлас - хоть на 1.0.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (18.08.2013)
Старый 20.08.2013, 02:45   #95
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: OpenGL

gl_Position = vec4(vposition*mat2(cos(angle),-sin(angle),sin(angle),cos(angle)),0.0,1.0);
vpostion - 2D вектор с координатами точки.
Решил вращать на гапи, передавая в шейдер угол поворота. Матрица проверенная, точно работать должна, однако результат дает очень странный, получается дикое искажение примитива, а не вращение. Как будто используется ещё и z ось. В чем может быть проблема?
Про оптимизацию не надо говорить, написал так здесь для краткости кода.
(Offline)
 
Ответить с цитированием
Старый 20.08.2013, 02:48   #96
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: OpenGL

В гапи ожидается screen space матрица, или ты умножаешь на viewport projection матрицу до твоего поворота?
(Offline)
 
Ответить с цитированием
Старый 20.08.2013, 02:51   #97
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: OpenGL

Нет, больше на матрицы я не умножаю. Можно подробнее? Это вообще необходимо при жестком 2D?
(Offline)
 
Ответить с цитированием
Старый 20.08.2013, 03:06   #98
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: OpenGL

Ну прежде чем отдавать в шейдере позицию вершины во фрагментный конвеер ты должен её умножить на матрицу камеры (viewproj).

Последний раз редактировалось moka, 20.08.2013 в 05:38.
(Offline)
 
Ответить с цитированием
Старый 20.08.2013, 04:11   #99
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: OpenGL

Сообщение от moka Посмотреть сообщение
Ну прежде чем отдавать в шейдере позицию в конвеер ты должен её умножить на матрицу камеры (viewproj).
Не обязательно. Центр экрана - 0,0, углы - +/- единица. Можешь сам к этому масштабу приводить как хочешь.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
HolyDel (20.08.2013), Nikich (20.08.2013)
Старый 20.08.2013, 05:38   #100
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: OpenGL

Сообщение от ABTOMAT Посмотреть сообщение
Не обязательно. Центр экрана - 0,0, углы - +/- единица. Можешь сам к этому масштабу приводить как хочешь.
Ну если заранее умножаешь объект на матрицу viewproj, то следственно и затем трансформируя его на свои повороты - не ожидай адекватного результата.

Ты пытаешься повернуть вершину уже в скрин-спейсе, и тут два варианта - либо ты в шейдере перед этим множишь на viewproj либо ещё до шейдера это делаешь (на CPU).
(Offline)
 
Ответить с цитированием
Старый 20.08.2013, 12:03   #101
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: OpenGL

Сообщение от Nikich Посмотреть сообщение
gl_Position = vec4(vposition*mat2(cos(angle),-sin(angle),sin(angle),cos(angle)),0.0,1.0);
vpostion - 2D вектор с координатами точки.
Решил вращать на гапи, передавая в шейдер угол поворота. Матрица проверенная, точно работать должна, однако результат дает очень странный, получается дикое искажение примитива, а не вращение. Как будто используется ещё и z ось. В чем может быть проблема?
Про оптимизацию не надо говорить, написал так здесь для краткости кода.
mat2 rotationMat = mat2(cos(angle),-sin(angle),sin(angle),cos(angle));
gl_Position = vec4(vposition*(projMat*viewMat*modelMat*rotationMat));
projMat, viewMat и modelMat - юниформы приезжающие с движка. Проекция, камера и положение объекта на сцене.

и вообще вскрой любой движок, так никто не делает. Обычно это на ЦПУ делается. modelMat должен приехать уже с поворотом, а вместо двух projMat, viewMat можно в шейдер отдавать уже перемноженый projViewMat, актуально для батчей, чтоб не перемножать на каждую вершину.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (20.08.2013)
Старый 20.08.2013, 12:11   #102
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: OpenGL

А почему тогда отображение без вращения верно?
И если всё же нужны матрицы, как её рассчитать вручную, без GLM? Просто как-то не ахти подключать дополнительную библиотеку для одного расчета, а гугл явно твердит, что следует использовать GLM.
(Offline)
 
Ответить с цитированием
Старый 20.08.2013, 12:14   #103
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: OpenGL

Сообщение от Nikich Посмотреть сообщение
А почему тогда отображение без вращения верно?
И если всё же нужна viewproj матрица, как её рассчитать вручную, без GLM? Просто как-то не ахти подключать дополнительную библиотеку для одного расчета, а гугл явно твердит, что следует использовать GLM.
да используй GLM. Там cpp-шников нет, библиотека построена на шаблонах, точно будет лучше, чем изобретать велосипед. Ну если так хочешь сам, то кури перемножение матриц. Вообще, рано или поздно, тебе придется использовать математическую библиотеку.
Можешь еще спросить у HolyDel, он реализовывал без GLM. Только вроде для mat4x4

p.s. если верно без вращения, значит ты уже в скрин спейсе формируешь и отправляешь в шейдер, тогда поворот будет работать относительно не своего центра, а точки 0.0 на экране, это центр

зачем тогда вообще на матрицу умножать?
вот на, кусок с моего движка
point BatchOpenGL::rotatePoint(float cx, float cy, float angle, point p)
{
    float s = sin(angle);
    float c = cos(angle);

    // translate point back to origin:
    p.x -= cx;
    p.y -= cy;

    // rotate point
    float xnew = p.x * c - p.y * s;
    float ynew = p.x * s + p.y * c;

    // translate point back:
    p.x = xnew + cx;
    p.y = ynew + cy;

    return p;
}
учти что angle может быть в углах или радианах. в чем точно не помню. Формула такая: Угол = Радиан * (180 / Пи)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (20.08.2013)
Старый 20.08.2013, 12:21   #104
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: OpenGL

У HolyDel же с 3D, мне оно вообще не нужно и не планируется, поэтому камера всегда будет в одном и том же положении, значит и матрица проекции на камеру тоже всегда будет одна и та же.
(Offline)
 
Ответить с цитированием
Старый 20.08.2013, 12:25   #105
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: OpenGL

Сообщение от Nikich Посмотреть сообщение
У HolyDel же с 3D, мне оно вообще не нужно и не планируется, поэтому камера всегда будет в одном и том же положении, значит и матрица проекции на камеру тоже всегда будет одна и та же.
короче, можешь попробовать прилепить в шейдер код, что я дал.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (20.08.2013)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL 3 HolyDel C++ 63 11.12.2014 22:23
Help:::OpenGl!!! zheland 3D-программирование 30 08.05.2008 20:52
Cos и Sin в OpenGL! pipns Delphi 8 19.11.2007 10:14
OpenGL 3.0 HolyDel C++ 10 18.11.2007 13:11


Часовой пояс GMT +4, время: 16:28.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com