2010-01-25 4 views
5

Я хочу использовать альфа-маску в OpenGL, чтобы белый (1) = видимый и черный (0) = скрытый.Альфа-маски с OpenGL

Итак, что я делаю, я пишу что-то в альфа-компоненте фреймбуфера, используя glColorMask(False, False, False, True) (я использую python, вы видите), а затем рисуете какую-то геометрию над ним, используя blending.

Но он не работает: Я попытался заполнить альфа-буфер полностью с помощью 0 и затем нарисовать некоторую геометрию, которая не должна быть видимой. Но он всегда появляется, альфа-буфер полностью игнорируется.

# Clear alpha buffer to 0, and clear color buffer. 
# After this, the alpha buffer should probaby be filled with 0. 
glClearColor(0, 0, 0, 0) 
glClear(GL_COLOR_BUFFER_BIT) 

# Disable blending. 
glDisable(GL_BLEND) 

# Disable color writing. 
glColorMask(False, False, False, True) 

# Set color to a white with alpha 0. 
glColor4f(1, 1, 1, 0) 

# Now draw a fullscreen quad. 
# After this, the alpha buffer should really be filled with 0. 
# Shouldn't it? 
glBegin(GL_QUADS) 
glVertex2f(0, 0) 
glVertex2f(320, 0) 
glVertex2f(320, 480) 
glVertex2f(0, 480) 
glEnd() 

# Enable color writing. 
glColorMask(True, True, True, True) 

# Enable blending so that incoming fragments are multiplied 
# by alpha values already in the buffer. 
glEnable(GL_BLEND) 
glBlendFunc(GL_DST_ALPHA, GL_ONE) 

# Set color to a white with alpha 1. 
glColor4f(1, 1, 1, 1)  

# Now draw a triangle. 
# It should not be visible because alpha in framebuffer is 0 
# and 0 * 1 = 0. 
glBegin(GL_TRIANGLES) 
glVertex2f(20, 50) 
glVertex2f(300, 50) 
glVertex2f(160, 210) 
glEnd() 

(Да, матрицы проекционных вправо так, мой экран находится в диапазоне от 0/0 до 320/240.)

треугольник не должен быть виден, что я сделал не так?

+1

Конечный результат: белый треугольник на черном фоне? Я не вижу ничего плохого в твоих шагах. – Bahbar

ответ

3

Попробуйте указать alpha buffer при создании своего контекста GL, если вы еще этого не сделали.

+0

Это было на деле проблема! Большое спасибо! – abenthy

0

Использование glAlphaFunc (GL_GREATER, 0.5);

+0

err ... Он использует смешивание, а не альфа-тестирование. Тестирование работы с альфа-версией, а не альфа-адресата. – Bahbar