|
18.08.2013, 02:30
|
#91
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: OpenGL
Как передать в шейдер множество текстур?
У меня есть большой массив vertexData, в котором хранятся координаты вертексов и координаты текстуры. Рисуется это всё дело за один glDrawArrays(верно ли?). И мне нужно на каждую пару треугольников(квад) наложить свою текстуру. Как это лучше всего сделать?
|
(Offline)
|
|
18.08.2013, 06:12
|
#92
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: OpenGL
GL_ARB_BINDLESS_TEXTURE - лучший вариант, но ето только на кеплере и выше. Тут у каждого пикселя может быть своя текстура, что очень круто. Тебе нужно будет лишь добавить к вершине аттрибут - 64битный хэндл текстуры на гпу.
если текстуры одинаковые по формату и размеру - texture array.
если разные - пакуй в атлас.
вообще последний вариант самый неприхотливый
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
18.08.2013, 18:40
|
#93
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: OpenGL
А как быть с контекстом постарее?
|
(Offline)
|
|
18.08.2013, 19:22
|
#94
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: OpenGL
атлас - хоть на 1.0.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.08.2013, 02:45
|
#95
|
Бывалый
Регистрация: 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
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: OpenGL
В гапи ожидается screen space матрица, или ты умножаешь на viewport projection матрицу до твоего поворота?
|
(Offline)
|
|
20.08.2013, 02:51
|
#97
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: OpenGL
Нет, больше на матрицы я не умножаю. Можно подробнее? Это вообще необходимо при жестком 2D?
|
(Offline)
|
|
20.08.2013, 03:06
|
#98
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: OpenGL
Ну прежде чем отдавать в шейдере позицию вершины во фрагментный конвеер ты должен её умножить на матрицу камеры (viewproj).
Последний раз редактировалось moka, 20.08.2013 в 05:38.
|
(Offline)
|
|
20.08.2013, 04:11
|
#99
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: OpenGL
Сообщение от moka
Ну прежде чем отдавать в шейдере позицию в конвеер ты должен её умножить на матрицу камеры (viewproj).
|
Не обязательно. Центр экрана - 0,0, углы - +/- единица. Можешь сам к этому масштабу приводить как хочешь.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
|
|
20.08.2013, 05:38
|
#100
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: OpenGL
Сообщение от ABTOMAT
Не обязательно. Центр экрана - 0,0, углы - +/- единица. Можешь сам к этому масштабу приводить как хочешь.
|
Ну если заранее умножаешь объект на матрицу viewproj, то следственно и затем трансформируя его на свои повороты - не ожидай адекватного результата.
Ты пытаешься повернуть вершину уже в скрин-спейсе, и тут два варианта - либо ты в шейдере перед этим множишь на viewproj либо ещё до шейдера это делаешь (на CPU).
|
(Offline)
|
|
20.08.2013, 12:03
|
#101
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.08.2013, 12:11
|
#102
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: OpenGL
А почему тогда отображение без вращения верно?
И если всё же нужны матрицы, как её рассчитать вручную, без GLM? Просто как-то не ахти подключать дополнительную библиотеку для одного расчета, а гугл явно твердит, что следует использовать GLM.
|
(Offline)
|
|
20.08.2013, 12:14
|
#103
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.08.2013, 12:21
|
#104
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: OpenGL
У HolyDel же с 3D, мне оно вообще не нужно и не планируется, поэтому камера всегда будет в одном и том же положении, значит и матрица проекции на камеру тоже всегда будет одна и та же.
|
(Offline)
|
|
20.08.2013, 12:25
|
#105
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: OpenGL
Сообщение от Nikich
У HolyDel же с 3D, мне оно вообще не нужно и не планируется, поэтому камера всегда будет в одном и том же положении, значит и матрица проекции на камеру тоже всегда будет одна и та же.
|
короче, можешь попробовать прилепить в шейдер код, что я дал.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:02.
|