2012-01-04 2 views
2

Я столкнулся с проблемой, когда прозрачность моделирования в OpenGL. Вот сценарий:OpenGL альфа-смешивание внутри прозрачного объекта

У меня есть корабль, который представлен сферой. Теперь я собираюсь добавить щит вокруг корабля. Я тоже выбрал сферу, но с большим радиусом и установил альфа-коэффициент 0,5 (непрозрачность). Однако экран не появляется и цвета не смешиваются (как будто его там не было).

Камера расположена в центре 1-й сферы. Я думаю, что проблема в том, что я внутри сферы, поэтому opengl просто проигнорирует ее (не рисует).

код выглядит следующим образом:

//ship colors setup with alpha 1.0f 
glutSolidSphere(1, 100, 100); original sphere (ship) 
//shield colors setup with alpha 0.5f 
glutSolidSphere(3, 100, 100); //the shield whose colors should blend with the rest of the scene 

У меня есть хотя имитировать щит с параллелепипеда в передней части судна. Однако это не то, что я хочу ...

EDIT: Я нашел ошибку. Я также установил параметр param gluPerspective() слишком , поэтому, несмотря на то, что я правильно установил альфа-значение, камера все время была перед объектом, поэтому не было никакого способа увидеть это.

ответ

0

Кажется работать здесь:

#include <GL/glut.h> 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0, 0, -5); 

    glDisable(GL_BLEND); 
    glColor4ub(255,0,0,255); 
    glutSolidCube(1.0); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glColor4ub(0,255,0,64); 
    glutSolidSphere(1.5, 100, 100); 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, w, h); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60, (double)w/(double)h, 0.01, 100); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Blending"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return EXIT_SUCCESS; 
} 
+0

хорошо камера не находится вне сферы, это в самом центре корабля .. Однако, кажется, работает тоже, если я двигаю камеру на центре куб в вашем примере. Можете ли вы объяснить, что происходит внутри объекта? –

+0

Ну, предполагая 'glEnable (GL_DEPTH_TEST)', и если вы находитесь внутри внутренней (= первой рисованной) сферы, выглядящей в буфере глубины, будет заполнено определенное (близкое) значение Z. Попытка вытянуть вторую сферу дальше приведет к тому, что тест глубины будет терпеть неудачу для каждого пикселя во второй сфере, так как они все будут «дальше», чем внутренняя сфера. Мой пример работает, потому что я не включаю 'GL_DEPTH_TEST', и по умолчанию он отключен. – genpfault

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