Я пытаюсь отобразить «прозрачные» поверхности (не закрытые тома) с лицевой стороной и задней поверхностью, которые видны (не отбракованы).Проблема с смешиванием альфа-альфа-альфа с обратной стороной лица
Например, с изображением конуса или цилиндра, в котором прозрачность применяется с обеих сторон. Есть некоторые видимые артефакты, где некоторая часть поверхности, похоже, неправильно обрабатывает альфа-значения.
Проблема заключается в том, что я (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
Спасибо. Макс.
спасибо. кажется, это долгий процесс для этого на нашем программном обеспечении. – Max
@Max, приветствую вас, достижение «реальной» прозрачности может занять некоторое количество работы. Достижение хорошей прозрачности может быть проще, в зависимости от ваших потребностей и контекста использования. Не стесняйтесь использовать/злоупотреблять любыми особенностями ваших моделей/среды/стиля рендеринга и т. Д. – rotoglup