Обходной путь для проверки прозрачности и глубины в OpenGL ES? - PullRequest
1 голос
/ 13 августа 2011

Я пытаюсь, чтобы тестирование глубины работало корректно на OpenGL ES, используя расширение draw_texture. Я рано понял, что «нормальные» координаты z при рендеринге с использованием этого расширения не работают. Это произошло из-за расширения, эффективно использующего координату Z в качестве отношения между 0 и 1, а не фактическую позицию z в ​​буфере глубины, как показано на странице текстуры рисования OES OpenGL:

Zs отображается на глубину окна Zw следующим образом:

             { n,                 if z <= 0
        Zw = { f,                 if z >= 1
             { n + z * (f - n),   otherwise

where <n> and <f> are the near and far values of
DEPTH_RANGE.

Я прочитал на странице FAQ по прозрачности для OpenGL, что:

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

Это подводит меня к моей проблеме. У меня 2 квадрата, оба 64х64. Они текстурированы с кругом. Квадрат «сверху» расположен немного дальше от квадрата ниже, вот так.

___________
|  .____.  |
| /      \ |
|_|______|_|
|  .____.  |
| /      \ |
| |   s  | |
|  \____/ t|
|__________|

Текстура круга - это сплошной цвет (цвета), который образует круг, затем полностью прозрачная окружающая область (t).

Когда OpenGL отображает его, квадрат под ним не проходит тест глубины и не отрисовывается, даже если пиксели над ним прозрачны, поэтому вы получаете эффект полукруга от слоя под ним, а не от всего изображения.

    BAD                   GOOD
___________           ___________
|  .____.  |          |  .____.  |
| /      \ |          | /      \ |
|_|______|_|          |_|      |_|
|  .____.  |          | \.____./ |
| /      \ |          | /      \ |
| |      | |          | |      | |
|  \____/  |          |  \____/  |
|__________|          |__________|

Как я могу предотвратить это?

1 Ответ

2 голосов
/ 19 августа 2011

При создании:

gl.glEnable(GL10.GL_ALPHA_TEST);
gl.glAlphaFunc(GL10.GL_GREATER,0.2f); 

Это решает проблему, но вам может потребоваться изменить 0.2f на более высокий или более низкий в зависимости от ваших текстур.

...