Точечные спрайты OpenGL с глубинным тестированием - проблема смешивания? - PullRequest
2 голосов
/ 22 сентября 2011

Я отображаю точечные спрайты (используя OpenGL ES 2.0 на iOS) как штрихи для рисования пользователя.Я храню эти точки в объектах буфера вершин, так что мне нужно выполнить проверку глубины, чтобы спрайты отображались в правильном порядке при отправке на рисование.

Я вижу странный эффект, когдаотрисовка этих штрихов рисования, как показано на следующем снимке экрана:

Point Sprite Blending Issue

Обратите внимание на цветную «границу» вокруг края синего штриха, где он нарисован над зеленым,Пользователь нарисовал синий штрих после зеленого, но когда VBO перерисовываются, синий штрих рисуется первым.Когда дело доходит до рисования зеленого штриха, начинается тестирование глубины, и он видит, что он должен быть позади синего штриха, и то же самое происходит с некоторым успехом.Мне кажется, это какая-то проблема смешения или неправильный расчет цвета во фрагментном шейдере?Края всех штрихов должны быть прозрачными, однако кажется, что фрагментный шейдер объединяет его с текстурой фона при обработке этих фрагментов.

В моем приложении я создал рендер-буфер глубины и вызвал glEnable(GL_DEPTH_TEST), используя glDepthFunc(GL_LEQUAL).Я экспериментировал с glDepthMask() безрезультатно.Смешивание установлено на glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA), а цвет точечного спрайта использует предварительно умноженные альфа-значения.Процедура рисования очень проста:

  • Привязка рендеринга к текстуре FBO.
  • Рисование фоновой текстуры.
  • Рисование точечных спрайтов (из ряда VBO).
  • Нарисуйте текстуру этого FBO в основной буфер кадров.
  • Представьте основной буфер кадров.


РЕДАКТИРОВАТЬ

Ниже приведен код из процедуры рисования.

Состояние установки перед рисованием:

glDisable(GL_DITHER);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

Процедура рисования:

[drawingView setFramebuffer:drawingView.scratchFramebuffer andClear:YES];
glUseProgram(programs[PROGRAM_TEXTURE]);
[self drawTexture:[self textureForBackgroundType:self.backgroundType]];

glUseProgram(programs[PROGRAM_POINT_SPRITE]);

// ...
// Draw all VBOs containing point sprite data
// ...

[drawingView setFramebuffer:drawingView.defaultFramebuffer andClear:YES];
glUseProgram(programs[PROGRAM_TEXTURE]);
[self drawTexture:drawingView.scratchTexture];

[drawingView presentFramebuffer:drawingView.defaultFramebuffer];

Спасибо за любую помощь.

1 Ответ

4 голосов
/ 22 сентября 2011

Если вы хотите нарисовать не непрозрачные геометрии, вы должны отсортировать их z-вперед.Это был единственный способ получить правильное смешивание в течение многих лет.В настоящее время существуют некоторые алгоритмы прозрачности, независимой от порядка, например, двойной пилинг, но они не применимы к iOS.

...