2012-01-14 7 views
2

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

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

static void Draw(void) 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

//big blue square 
glColor3ub(0,255,255); 
glBegin(GL_POLYGON); 
glVertex3i(5, 5, 0); 
glVertex3i(-5, 5, 0); 
glVertex3i(-5, -5, 0); 
glVertex3i(5, -5, 0); 
glEnd(); 

glStencilFunc(GL_ALWAYS, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

/* transparent triangle */ 
glColor4ub(0.0f, 0.0f, 0.0f, 0.0f); 
glBegin(GL_POLYGON); 
glVertex3i(-4, -4, 0); 
glVertex3i(4, -4, 0); 
glVertex3i(0, 4, 0); 
glEnd(); 

glStencilFunc(GL_EQUAL, 1, 1); 
glStencilOp(GL_INCR, GL_KEEP, GL_DECR); 

glStencilFunc(GL_EQUAL, 2, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

/* blue square */ 
glColor3ub(0, 0, 200); 
glBegin(GL_POLYGON); 
glVertex3i(3, 3, 0); 
glVertex3i(-3, 3, 0); 
glVertex3i(-3, -3, 0); 
glVertex3i(3, -3, 0); 
glEnd(); 

if (doubleBuffer) { 
    glutSwapBuffers(); 
} else { 
    glFlush(); 
} 
} 

ответ

5

Проблема одна: При рисовании либо отключить проверку трафарета фона перед тем, или переключить функцию трафарета GL_ALWAYS так, что фрагменты проходят (я рекомендую отключить его). Затем вы устанавливаете два разных шаблона modi после этого, но не будете делать то, что вы намерены. Итак, вот изменение:

glDisable(GL_STENCIL_TEST); 
glStencilMask(0x0); 

draw_background(); 

glEnable(GL_STENCIL_TEST); 
glStencilMask(0x1); 
glStencilFunc(GL_ALWAYS, 0x1, 0x1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glDepthMask(GL_FALSE); 

draw_trangle(); 

glStencilFunc(GL_NOTEQUAL, 0x1, 0x1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glDepthMask(GL_TRUE); 

draw_blue_square(); 
+0

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

+0

@westr: Да, может быть. Я также признаю, что я не тестировал этот код. Не могли бы вы поместить весь исходный код в pastebin. Это позволяет мне: а) воспроизвести вашу проблему и b) исправить ее на месте. – datenwolf

+0

здесь ya go http://pastebin.com/636kyXU7 –

 Смежные вопросы

  • Нет связанных вопросов^_^