GL_BLEND не работает правильно с Vertex Array - PullRequest
0 голосов
/ 26 июня 2018

У меня есть этот визуализатор 3D-модели, который производит 3D-модели, начиная с Disparity Maps, вот пример:

Введите:

enter image description here enter image description here

Выход:

enter image description here

3D визуализатор написан на OpenGL и GLUT, в частности, весь код можно найти здесь:

https://github.com/lpuglia/DisparityVisualizer

Модель построена с использованием GL_TRIANGLE_STRIP в GL_VERTEX_ARRAY. Эта статья объясняет способ воспроизведения моей модели:

http://www.learnopengles.com/tag/vbos/

В частности, я использую следующий код в качестве функции дисплея:

glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
glVertexPointer( 3, GL_FLOAT, 0, vertices );
glColorPointer( 4, GL_FLOAT, 0, colors );
glDrawElements( GL_TRIANGLE_STRIP, getIndicesCount(width,height), GL_UNSIGNED_INT, indices );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );

У меня проблемы с управлением прозрачностью, в данный момент я использую этот код для инициализации:

glEnable (GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);

Как вы, возможно, уже заметили, функция glColorPointer используется с 4 каналами, на самом деле, я использую 4-й канал, чтобы установить альфа точек на краю объектов (отмеченных синим здесь):

enter image description here

Этот подход работает, но не для каждого угла (?), Как вы можете заметить в этой анимации:

enter image description here

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

1 Ответ

0 голосов
/ 26 июня 2018

Так что, по-видимому, для моих целей мне не нужно смешивать, мне просто нужно включать и выключать альфу, что я могу просто сделать, заменив:

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

С:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_EQUAL, 1.0);
...