OpenGL рисует GL_LINES поверх GL_QUADS - PullRequest
0 голосов
/ 05 марта 2012

Я рисую куб и линейную сетку в 3D в OpenGL:

glBegin(GL_QUADS);
...
glEnd();

glBegin(GL_LINES);
...
glEnd();

Теперь, независимо от порядка (если сначала я рисую линии или сначала квадраты) и независимо от положения, всегда случается, что линии рисуются над кубом. Я думал, что OpenGL рисует спереди назад.

Я пытался использовать:

glEnable(GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE);

, который работает, но часть куба теперь прозрачна. Я также попытался glDepthFunc(GL_NEVER) с отключением glEnable (GL_DEPTH_TEST), но у меня та же проблема, что куб выглядит прозрачным.

У кого-нибудь есть подсказка, чтобы преодолеть эту проблему?

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Теперь, независимо от порядка (если сначала я рисую линии или сначала квадраты) и независимо от положения, всегда случается, что линии рисуются над кубом.

ЕСЛИ ваши строки имеют правильную глубину, то вы забыли включить буфер глубины. Если вы включили буфер глубины, то вы должны убедиться, что ваша библиотека используется для инициализации запрошенного буфера глубины OpenGL.

Я думал, что OpenGL рисует спереди назад.

Это не так. OpenGL рисует полигоны в том же порядке, в котором вы их указали. Там нет автоматической сортировки любого рода.

У кого-нибудь есть подсказка, чтобы преодолеть эту проблему?

Ну, вы могли бы очистить буфер глубины, но это будет медленно и неэффективно. Технически, вы почти никогда не должны этого делать.

glDepthMask(GL_FALSE) отключит запись в буфер глубины. то есть любой объект, нарисованный после этого вызова, не будет обновлять буфер глубины, но будет использовать данные, которые уже сохранены. Он часто используется для систем частиц. Назовите glDepthMask(GL_FALSE), нарисуйте «линии», назовите glDepthMask(GL_TRUE), затем нарисуйте куб.

Если вы объедините glDepthMask(GL_FALSE) с glDepthFunc(GL_ALWAYS), тогда объект всегда будет отрисован, полностью игнорируя буфер глубины (но буфер глубины не будет изменен).

1 голос
/ 05 марта 2012

Если вы хотите нарисовать линии на заднем плане, сначала нарисуйте их (и остальную часть фона), очистите буфер глубины, а затем визуализируйте остальную часть сцены.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...