forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   OpenGL (http://forum.boolean.name/showthread.php?t=356)

Nikich 18.08.2013 02:30

Ответ: OpenGL
 
Как передать в шейдер множество текстур?
У меня есть большой массив vertexData, в котором хранятся координаты вертексов и координаты текстуры. Рисуется это всё дело за один glDrawArrays(верно ли?). И мне нужно на каждую пару треугольников(квад) наложить свою текстуру. Как это лучше всего сделать?

HolyDel 18.08.2013 06:12

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

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

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

вообще последний вариант самый неприхотливый

Nikich 18.08.2013 18:40

Ответ: OpenGL
 
А как быть с контекстом постарее?

HolyDel 18.08.2013 19:22

Ответ: OpenGL
 
атлас - хоть на 1.0.

Nikich 20.08.2013 02:45

Ответ: OpenGL
 
Код:

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

moka 20.08.2013 02:48

Ответ: OpenGL
 
В гапи ожидается screen space матрица, или ты умножаешь на viewport projection матрицу до твоего поворота?

Nikich 20.08.2013 02:51

Ответ: OpenGL
 
Нет, больше на матрицы я не умножаю. Можно подробнее? Это вообще необходимо при жестком 2D?

moka 20.08.2013 03:06

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

ABTOMAT 20.08.2013 04:11

Ответ: OpenGL
 
Цитата:

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

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

moka 20.08.2013 05:38

Ответ: OpenGL
 
Цитата:

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

Ну если заранее умножаешь объект на матрицу viewproj, то следственно и затем трансформируя его на свои повороты - не ожидай адекватного результата.

Ты пытаешься повернуть вершину уже в скрин-спейсе, и тут два варианта - либо ты в шейдере перед этим множишь на viewproj либо ещё до шейдера это делаешь (на CPU).

pozitiffcat 20.08.2013 12:03

Ответ: OpenGL
 
Цитата:

Сообщение от Nikich (Сообщение 265549)
Код:

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, актуально для батчей, чтоб не перемножать на каждую вершину.

Nikich 20.08.2013 12:11

Ответ: OpenGL
 
А почему тогда отображение без вращения верно?
И если всё же нужны матрицы, как её рассчитать вручную, без GLM? Просто как-то не ахти подключать дополнительную библиотеку для одного расчета, а гугл явно твердит, что следует использовать GLM.

pozitiffcat 20.08.2013 12:14

Ответ: OpenGL
 
Цитата:

Сообщение от Nikich (Сообщение 265571)
А почему тогда отображение без вращения верно?
И если всё же нужна 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 / Пи)

Nikich 20.08.2013 12:21

Ответ: OpenGL
 
У HolyDel же с 3D, мне оно вообще не нужно и не планируется, поэтому камера всегда будет в одном и том же положении, значит и матрица проекции на камеру тоже всегда будет одна и та же.

pozitiffcat 20.08.2013 12:25

Ответ: OpenGL
 
Цитата:

Сообщение от Nikich (Сообщение 265573)
У HolyDel же с 3D, мне оно вообще не нужно и не планируется, поэтому камера всегда будет в одном и том же положении, значит и матрица проекции на камеру тоже всегда будет одна и та же.

короче, можешь попробовать прилепить в шейдер код, что я дал.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot