Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.119.17] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Тут буду постить мелкие вопросы по OpenGL (на абстрактном ЯП), ответ на которые либо не понял, либо понял, но не до конца, либо вообще не нашёл в интернетах.
1) В чём отличие задавать меши с помощью вершинного шейдера: attribute vec4 a_Position; void main() { gl_Position = a_Position; } .... // a_Position - ссылка на атрибут a_Position gl.vertexAttrib3f(a_Position, x1, y1, .0); gl.drawArrays(gl.POINTS, 0, 1); gl.vertexAttrib3f(a_Position, x2, y2, .0); gl.drawArrays(gl.POINTS, 0, 1); gl.vertexAttrib3f(a_Position, x3, y3, .0); gl.drawArrays(gl.POINTS, 0, 1); И с помощью нативных вызовов: gl.begin(gl.POINTS); gl.vertex2f(x1, y1); gl.end(); gl.begin(gl.POINTS); gl.vertex2f(x2, y2); gl.end(); gl.begin(gl.POINTS); gl.vertex2f(x3, y3); gl.end(); В чём отличия, преимущества, смысл вообще существования двух разных способов отрисовки трёх точек? *Я в курсе, что begin\end - это GL1+, а drawArrays - GL2+. Просто совмещал примеры вообще на разных языках =) |
Сообщ.
#2
,
|
|
|
При модификации координат при вращение анимации и других расчётах
Шейдоры работают на GPU, begin-end на CPU. Плюс на CPU можете модифицировать длину массива, а на GPU только с шейдеров 5 версии. begin-end он как бы не для точек. А для динамически изменяющейся сцены. А шейдоры для статики. Или есть технология предварительного расчёта. На begin-end больше возможностей, на шейдерах зависит от версии . |
Сообщ.
#3
,
|
|
|
Цитата Pavia @ Плюс на CPU можете модифицировать длину массива, а на GPU только с шейдеров 5 версии. хмхм? Имеется ввиду кидать в шейдер больше чем v4f за раз? |
Сообщ.
#4
,
|
|
|
Давай немного проясним вопрос. Вас интересует конкретная предметная область вывод точки? Или вместо точек любой другой примитив к примеру мэшь?Т.е. вас интересует конкретный пример или интересуют потенциальные возможности OpenGL?
Почему есть два метода? Пожалуй это дело вкуса кто-то ест рис ложкой, ктото вилкой, а иные палочками. Есть старый метод, есть новый. У каждого есть свои ограничения. Для 3-х точек они не принципиальны. Правда стоит сказать чтр второй пример ужастный. Вместо того что-бы сразу отдать на обработку весь массив из N точек он дёргает по одной точке. Запомните групповые операции работают быстрее. В данном случае такой подход сбивает движёк opengl, но не сильнее чем в примере с begin-end. |
Сообщ.
#5
,
|
|
|
Цитата Pavia @ Вас интересует конкретная предметная область вывод точки? Или вместо точек любой другой примитив к примеру мэшь? насколько я понял по примерам - отличия только в способе рендера, в моём случае POINTS, но ничего не мешает мне заменить на QUADS или лучше даже TRIANGLE_STRIP (но тогда надо либо всё поместить между begin\end, либо вызвать drawArrays только один раз), так что нет. В моём случае не стоило применять термин "меш", т.к. в примере это всё же просто точки. Цитата Pavia @ Т.е. вас интересует конкретный пример или интересуют потенциальные возможности OpenGL? Второе; Пример - это лишь частный случай в попытке понять возможности и разобраться с АПИ. Цитата Pavia @ Вместо того что-бы сразу отдать на обработку весь массив из N точек он дёргает по одной точке. Запомните групповые операции работают быстрее. Это для того, что бы пример походил на первый, конечно же, в реальной жизни я написал бы все три точки между begin\end |
Сообщ.
#6
,
|
|
|
Цитата Serafim @ Вроде бы у шейдеров есть некоторые затруднения с QUADS'ами. Так что безопаснее через TRIANGLE_STRIP прокрутить, если что. в моём случае POINTS, но ничего не мешает мне заменить на QUADS или лучше даже TRIANGLE_STRIP |
Сообщ.
#7
,
|
|
|
2) Eсть функция\метод gl.ortho он определяет координатную сетку, например:
gl.ortho(0, 800, 0, 600, 1, -1) Это просто абстрактные координаты, которые помимо указания направления осей XYZ задают соответсвие между размерами будущих объектов, их позицией и этой системой. Т.е. точка (видимый объект) в точке (координатной) 400, 300, 0 будет ровно по середине (в случае нулевой камеры). Верно? 2.1) В этом случае камера (пока опустим реализацию) - точка взгляда на эту систему координат с отсечением по near и far и наличием угла обзора (fov). Так? 2.1) viewport - способ соотношения "взгляда" камеры на монитор? В результате получаем примерно вот такое: Прикреплённая картинка
Добавлено Цитата Славян @ Вроде бы у шейдеров есть некоторые затруднения с QUADS'ами. Так что безопаснее через TRIANGLE_STRIP прокрутить, если что. там в любом случае жопа какая-то будет (скорее всего просто ничего не нарисуется, т.к. GL отбрасывает лишнее по-дефолту), точек же всего три, а квадрат состоит из 4х да и просто квадраты - это изврат. |
Сообщ.
#8
,
|
|
|
Цитата Serafim @ Кому - как: рисуя QUADS'ы я всё время жду, что нарисуется честная билинейная гладкая поверхность, но все движки/дрова так сделаны, что рисуется то одна, то другая пара треугольников. да и просто квадраты - это изврат. |
Сообщ.
#9
,
|
|
|
Цитата Serafim @ Это просто абстрактные координаты, Слово абстрактные тут не к месту. Абстракция это по сути общение нескольких реализаций. Выделения общего для всех вариантов. А где тут обобщение? Цитата Serafim @ случае нулевой камеры). Верно? Да. Цитата Serafim @ В этом случае камера (пока опустим реализацию) - точка взгляда на эту систему координат с отсечением по near и far и наличием угла обзора (fov). Так? Несуществует такого понятия как "точка взгляда". Есть точка положения камеры и вектор направления взгляда. У ортогональной проекции нет угла обзора. Как сказал молодой клон профессора из футурамы. Поймите двигатель не двигает корабль, двигатель двигает вселенную. Так же и тут. viewport по сути переводит ближнюю плоскость камеры в экранные координаты. В viewport мы указываем окно или лучше рамки в которых будет отображаться результат растеризации. Цитата Serafim @ В результате получаем примерно вот такое: Картинка не правильная. glOrto и glPerpective это два вида проекции от сюда у вас и путаница. Отсюда имеет два вида камер. Вам надо разделить термины на два лагеря. Термины предметной области и термины OpenGl для реализации первых. Как переменные и типы. К примеру var Boy, Girl: TBody; переменные: Мальчик, Девочка: Человек; 1) Так вот терминам предметной области стоит отнести следующие понятия: сцена, камера, объект, видовое окно. 2) glOrto, glPerspective, матрицы, glViewport это инструмент для реализации понятий описанных в первой группе. Надо структурировать подход к разработке выделив объекты Сцена, камера, объект. И в дальнейшем при создании рендера работать уже с ними. А вот для реализации методов, свойств этих объектов использовать opengl. Не старайтесь охватить это одновременно. |
Сообщ.
#10
,
|
|
|
Ну я пытаюсь перейти от высокоуровневых реализаций (движков) до низкоуровневого апи, отсюда такая путаница, когда я вместо инструмента оперирую целым понятием (реализацией некой сущности), есть такое
|
Сообщ.
#11
,
|
|
|
Так-с, вроде понятно, что ортогональная проекция и перспективная - немного разные, взаимозаменяемые штуки. На картинке, камера есть ни что иное, как perspective, а ortho - ортогональная.
Есть вот такой пример, более или менее понятный и максимально облегчённый: GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); //GL11.glOrtho(-10, 10, -10, 10, 10, -10); GLU.gluPerspective(65.0f, (float)(8.0/6.0), 0.1f, 100.0f); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glViewport(0, 0, 800, 600); while (!Display.isCloseRequested()) { GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GL11.glColor3f(.5f, .5f, 1.0f); GL11.glBegin(GL11.GL_TRIANGLES); GL11.glVertex3f( 0.0f, 1.0f, 0.0f); GL11.glVertex3f(-1.0f,-1.0f, 0.0f); GL11.glVertex3f( 1.0f,-1.0f, 0.0f); GL11.glEnd(); Display.update(); } Если использовать glOrtho, то всё ок, если переключиться на gluPerspective, то экран пустой. Думал что это из-за того, что near перспективы 0.1, а треугольник рисуется за границей отсечки (на 0.0). Поигравшись с позицией по Z понял, что нет. Скорее всего что-то пропустил, что-то существенное, а именно координатную сетку, которую я задавал ранее с помощью glOrtho. Или ещё что-то? Для облегчения вам работы (помощи ньюблу), могу создать репу на гитхабе с реальным (полным кодом) и бинарниками для просмотра, если хотите. Добавлено Если учитывать эту логику: Цитата Pavia @ 1) Так вот терминам предметной области стоит отнести следующие понятия: сцена, камера, объект, видовое окно. и Цитата Pavia @ 2) glOrto, glPerspective, матрицы, glViewport это инструмент для реализации понятий описанных в первой группе. то получаем то, что камеры без сцены не может существовать, по-этому пробовал использовать одновременно и perspective и ortho, но результат не меняется. Добавлено Цитата Pavia @ Надо структурировать подход к разработке выделив объекты Сцена, камера, объект. И в дальнейшем при создании рендера работать уже с ними. А вот для реализации методов, свойств этих объектов использовать opengl. пока не хочется разносить всё на объекты и абстрагироваться от opengl вызовов, надо вкурить базис, а потом уже начинать развлекаться, иначе абстракция получится костыльная. По-этому стараюсь пока писать максимально лаконичные процедурные шняжки, имея на экране минимальный работоспособный функционал, поигравшись с ним уже вводить новые методы и разделять уже более-менее готовое для выноса. |
Сообщ.
#12
,
|
|
|
Цитата Serafim @ GLU.gluPerspective(65.0f, (float)(8.0/6.0), 0.1f, 100.0f); Цитата zNear The distance from the viewer to the near clipping plane (always positive). zFar The distance from the viewer to the far clipping plane (always positive). GL11.glVertex3f( 0.0f, 1.0f, 0.0f); GL11.glVertex3f(-1.0f,-1.0f, 0.0f); GL11.glVertex3f( 1.0f,-1.0f, 0.0f); Т.е. Уже ошибка мы не видим треугольник так как он не попадает во внутрь усечённой пирамиды. Надо GL11.glVertex3f( 0.0f, 1.0f, 1.0f); GL11.glVertex3f(-1.0f,-1.0f, 1.0f); GL11.glVertex3f( 1.0f,-1.0f, 1.0f); Но лучше просто glTransform(0,0,-Near); Тогда все точки подвинуться. Что принципе будет выражаться перемещения центра камеры. Фокус будет выходить за камеру, находится позади неё. |
Сообщ.
#13
,
|
|
|
Цитата Pavia @ Т.е. Уже ошибка мы не видим треугольник так как он не попадает во внутрь усечённой пирамиды. Цитата Serafim @ Думал что это из-за того, что near перспективы 0.1, а треугольник рисуется за границей отсечки (на 0.0). Поигравшись с позицией по Z понял, что нет. Как следствие единица тоже не работает (пробовал 10 и 50, сейчас проверил с единицей). Добавлено С транслейтом тоже пусто, что на отрицательные значения, что на положительные. Смена fov тоже ничего не даёт. Добавлено Надо было вызвать GL11.glLoadIdentity(); |
Сообщ.
#14
,
|
|
|
Цитата Serafim @ L11.glLoadIdentity();parseOne('code_8','java',false) после очистки экрана. Вы отменили GL11.glViewport(0, 0, 800, 600); Забыл сказать что при использование glViewport надо ещё правильно размеры фигур высчитать. Вроде как в 800 раз увеличить. glLoadIdentity Присваивает текущей матрице единичную матрицу. 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 OpenGl не оперирует понятиями объект, сцена. Он оперирует матрицами. И честно математика оторванная от жизни. |
Сообщ.
#15
,
|
|
|
Цитата Pavia @ Забыл сказать что при использование glViewport надо ещё правильно размеры фигур высчитать. Вроде как в 800 раз увеличить. Вроде как всё нормально работает: Прикреплённая картинка
Цитата Pavia @ Вы отменили GL11.glViewport(0, 0, 800, 600); Если указать вьюпорт в два раза меньше, то результат (треугольник) соответственно рисуется в два раза меньше. Ничего вроде не отменяется. Цитата Pavia @ glLoadIdentity Присваивает текущей матрице единичную матрицу. Ну так вроде я не применял никаких матриц преобразований (по крайней мере явно). Разве что glTranslatef в моём примере, если думать логично, должен накладывать матрицу: -6 0 0 0 0 -6 0 0 0 0 -6 0 0 0 0 1 |