2011-01-12 3 views
1

Я пытаюсь отобразить «прозрачные» поверхности (не закрытые тома) с лицевой стороной и задней поверхностью, которые видны (не отбракованы).Проблема с смешиванием альфа-альфа-альфа с обратной стороной лица

Например, с изображением конуса или цилиндра, в котором прозрачность применяется с обеих сторон. Есть некоторые видимые артефакты, где некоторая часть поверхности, похоже, неправильно обрабатывает альфа-значения.

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

void init() 
{ 
    glMatrixMode(GL_PROJECTION); 
    gluPerspective(/* field of view in degree */ 40.0, 
     /* aspect ratio */ 1.0, 
     /* Z near */ 1.0, /* Z far */ 10.0); 
    glMatrixMode(GL_MODELVIEW); 
    gluLookAt(0.0, 0.0, 5.0, /* eye is at (0,0,5) */ 
     0.0, 0.0, 0.0,  /* center is at (0,0,0) */ 
     0.0, 1.0, 0.);  /* up is in positive Y direction */ 
    glTranslatef(0.0, 0.6, -1.0); 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); 
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); 
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position); 
    glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse); 
    glLightfv(GL_LIGHT2, GL_POSITION, light2_position); 

    glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST); 
    //glEnable(GL_CULL_FACE); 
    glFrontFace(GL_CW); 

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

} 
void draw() 
{ 
    static GLfloat amb[] = {0.4f, 0.4f, 0.4f, 0.0f}; 
    static GLfloat dif[] = {1.0f, 1.0f, 1.0f, 0.0f}; 
    static GLfloat back_amb[] = {0.4f, 0.4f, 0.4f, 1.0f}; 
    static GLfloat back_dif[] = {1.0f, 1.0f, 1.0f, 1.0f}; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_LIGHT1); 
    glDisable(GL_LIGHT2); 
    amb[3] = dif[3] = 0.5f;// cos(s)/2.0f + 0.5f; 
    glMaterialfv(GL_FRONT, GL_AMBIENT, amb); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif); 
    glMaterialfv(GL_BACK, GL_AMBIENT, back_amb); 
    glMaterialfv(GL_BACK, GL_DIFFUSE, back_dif); 
    glPushMatrix(); 
    glTranslatef(-0.3f, -0.3f, 0.0f); 
    glRotatef(angle1, 1.0f, 5.0f, 0.0f); 
    glutSolidCone(1.0, 1.0, 50, 2); 
    glPopMatrix(); 

    ///... 
    SwapBuffers(wglGetCurrentDC()); // glutSwapBuffers(); 

} 

код основан на: http://www.sgi.com/products/software/opengl/examples/glut/examples/source/blender.c

tinyurled ссылки на 2 изображения на Flickr, показывая вопрос (но из другого кода производства, а не выше кода, но оба имеют такие же проблемы): http://flic.kr/p/99soxy и http://flic.kr/p/99pg18

Спасибо. Макс.

ответ

5

Ваша проблема, вероятно, состоит из двух проблем.

  • в качестве глубины тест включен, и все многоугольники писать буфер глубины, многоугольники, которые дальше не могут внести свой вклад в цвет пикселя, если они нарисованы после ближайших полигонов. Вы должны попытаться отключить проверку глубины.

  • alphablending - это некоммутативная операция, поэтому порядок, в котором рисуются треугольники, важен и изменяет результат. Чтобы иметь последовательный результат, вам придется рисовать треугольники в последовательном порядке. В вашем коде этот порядок может отличаться в зависимости от точки зрения, например. Поскольку ваши объекты выпуклые, вы можете нарисовать свой объект за два прохода, оба с включенным отбраковкой, первый проход рисует обратные треугольники (наиболее удаленные от камеры), затем передние треугольники (ближайшие)

В целом, правильное смешивание для произвольной геометрии является трудной проблемой, вы можете захотеть взглянуть на алгоритмы Order Independent Transparency (глубинный пилинг, ...), если вы хотите пойти дальше.

+0

спасибо. кажется, это долгий процесс для этого на нашем программном обеспечении. – Max

+0

@Max, приветствую вас, достижение «реальной» прозрачности может занять некоторое количество работы. Достижение хорошей прозрачности может быть проще, в зависимости от ваших потребностей и контекста использования. Не стесняйтесь использовать/злоупотреблять любыми особенностями ваших моделей/среды/стиля рендеринга и т. Д. – rotoglup

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