Подтвердить что ты не робот

В openGL, как вы можете получить предметы, чтобы вернуться назад?

По умолчанию кажется, что объекты рисуются спереди назад. Я рисую двухмерный объект пользовательского интерфейса и хотел бы создать его обратно. Например, я мог бы сначала создать белый квадрат, а затем создать немного меньший черный квадрат поверх него, создав тем самым черную панель с белой рамкой. Этот пост имел некоторое обсуждение на нем и описал этот порядок как "Алгоритм Животворения", но в конечном счете пример, который они дали, просто визуализировал объекты в обратном порядке получить желаемый эффект. Я возвращаюсь назад (первые объекты идут назад, последующие объекты получают рисование сверху) рендеринг может быть достигнут посредством некоторого преобразования (gOrtho?)?

Я также упомянул, что меня не интересует решение с использованием библиотеки обертки, такой как GLUT.

Я также обнаружил, что поведение по умолчанию на Mac с помощью Cocoa NSOpenGLView, похоже, обращается назад, где, как и в Windows, я не могу получить это поведение. Код установки в окнах, которые я использую, это:

glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);           
glLoadIdentity();                      
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);             
glLoadIdentity();                       
4b9b3361

Ответ 1

Следующий вызов отключит проверку глубины, в результате чего объекты создаются в созданном порядке. Это приведет к тому, что объекты будут обращены назад.

glDepthFunc(GL_NEVER);      // Ignore depth values (Z) to cause drawing bottom to top

Убедитесь, что вы не вызываете это:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing

Ответ 2

В вашем конкретном вопросе нет стандартного способа указания порядка глубин в OpenGL. Некоторые реализации могут выполнять настройку глубины переднего фронта по умолчанию, потому что она обычно быстрее, но это не гарантируется (как вы обнаружили).

Но я действительно не вижу, как это поможет вам в вашем сценарии. Если вы нарисуете черный квадрат перед белым квадратом, черный квадрат должен быть нарисован перед белым квадратом, независимо от того, в каком порядке он нарисован, до тех пор, пока вы включили буферизацию глубины. Если они на самом деле копланарны, то ни один из них не стоит перед другим, и любой алгоритм сортировки глубины будет непредсказуемым.

Учебник, в котором вы размещали ссылку, только об этом говорили, потому что сортировка глубины имеет значение, когда вы используете прозрачность. Но мне это не кажется, что вы после.

Но если вам действительно нужно это делать, тогда вы должны сделать это сами. Сначала отправьте свой белый квадрат в конвейер рендеринга, заставьте рендер, а затем отправьте свой черный квадрат. Если вы сделаете это так и отключите буферизацию глубины, квадраты могут быть компланарными, и вам все равно будет гарантировано, что черный квадрат будет нарисован над белым квадратом.

Ответ 3

Порядок рисования сложный. Нет простого решения. Алогоризм художника (сортировка объектов по их расстоянию относительно вашего вида камеры) является наиболее простым, но, как вы обнаружили, он не решает всех случаев.

Я бы предложил комбинацию альгроизма и слоев художника. Вы создаете слои для определенных элементов в своей программе. Таким образом, вы получили фоновый слой, слои объектов, специальные слои эффектов и слой GUI.

Используйте алгоритм живописца для каждого элемента слоя. В некоторых специальных слоях (например, вашем слое GUI) не сортируйте с помощью алгоритма живописи, а по своему порядку вызова. Сначала вы называете этот белый квадрат, чтобы он сначала рисовался.

Ответ 4

Нарисуйте элементы, которые вы хотите быть сзади немного позади предметов, которые вы хотите видеть спереди. То есть, фактически измените значение z (предполагая, что z перпендикулярно плоскости экрана). Вам не нужно много менять его, чтобы получить предметы для рисования перед каждым. И если вы слегка измените значение z, вы не должны заметить значительную часть смещения от желаемой позиции. Вы даже можете по-настоящему полюбить и вычислить правильную позицию x, y на основе измененной позиции z, чтобы элемент появился там, где он должен быть.

Ответ 5

Ваши данные будут нарисованы в том порядке, в котором вы вызываете функции glBegin/glEnd. Вы можете получить глубинную буферизацию с использованием z-буфера, и если ваши 2d-объекты имеют разные значения z, вы можете получить нужный эффект сюда. Единственный способ, которым вы видите поведение, которое вы описываете на Mac, - это то, что программа черпает материал в обратном порядке вручную или использует z-буфер для достижения этого. OpenGL в противном случае не имеет никаких функций автоматически, как вы описываете.

Ответ 6

Как отметил Алан Клей, способ сделать это - отключить буфер глубины. Алгоритм живописи - это метод 2D сканирования, который используется для рендеринга полигонов в правильном порядке, когда у вас нет чего-то вроде z-буфера. Но вы не будете применять его к 3D-полигонам. Обычно вы трансформируете и проецируете их (обрабатываете пересечения с другими полигонами), а затем сортируете результирующий список двумерных проекционных полигонов по их проецируемой z-координате, затем рисуете их в обратном z-порядке.

Я всегда думал о алгоритме художника как альтернативный метод удаления скрытой поверхности, когда вы не можете (или не хотите) использовать z-буфер.