Полупрозрачность полигонов GLKit

Я пытаюсь рисовать полупрозрачные полигоны с помощью GLKit, но безуспешно. Поэтому мне было интересно, возможно ли вообще иметь полупрозрачные полигоны в GLKit, поскольку я знаю, что это не поддерживается в стандартной реализации OpenGL; но можно имитировать с помощью пользовательских шейдеров. Но поскольку GLKit компилирует свой собственный шейдер, мне нужно знать, следует ли мне продолжать использовать GLKit или использовать свой собственный шейдер. Мой код ниже:

// setup states
glEnable(GL_BLEND);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

self.effect.texture2d0.enabled   = GL_FALSE;
self.effect.colorMaterialEnabled = GL_TRUE;
self.effect.transform.modelviewMatrix = self.modelMatrix;

glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribColor);

[self.effect prepareToDraw];

// draw triangles
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(LineVertex), &_vertices[0].pos);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(LineVertex), &_vertices[0].color);

glDrawArrays(GL_TRIANGLES, 0, _vertexCount);

Заранее спасибо.


person Basil Al-Dajane    schedule 14.09.2012    source источник
comment
Просто для ясности: вы определенно имеете в виду полупрозрачность или прозрачность?   -  person Tim    schedule 14.09.2012
comment
полупрозрачность — я знаю, как сделать многоугольник либо непрозрачным, либо прозрачным; но я не могу понять, как правильно сделать 0,5 альфа. На самом деле проблема возникает из-за того, что два полигона с альфа-каналом 0,5 перекрывают друг друга, что не дает пересечения с альфа-каналом 1,0.   -  person Basil Al-Dajane    schedule 14.09.2012
comment
Прозрачность не означает невидимость, вещи могут быть частично прозрачными. Полупрозрачность подразумевает размытие или рассеяние света позади полупрозрачного объекта. Полупрозрачность, вероятно, сложно реализовать в OpenGL, в то время как прозрачность (полная или частичная) поддерживается достаточно хорошо. Проблема, которую вы описываете, звучит как проблема прозрачности.   -  person Tim    schedule 14.09.2012
comment
спасибо Тиму за то, что направил меня в правильном направлении; обновлю этот пост после некоторых исследований   -  person Basil Al-Dajane    schedule 14.09.2012


Ответы (2)


Ваш вопрос сбивает с толку, но похоже, что у вас есть прозрачные объекты, рисующие друг друга?, если это так, используйте

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

вместо того, что вы там получили.

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

person lzl    schedule 16.09.2012

Проблема оказалась в том, что где-то раньше у меня был glEnable(GL_DEPTH_TEST), который останавливал два полигона с альфой 0,5, создавая пересечение с альфой 1,0.

person Basil Al-Dajane    schedule 17.09.2012