Създаване на полупрозрачна текстура в PyOpenGL

В моята сцена имам куб в сфера. Бих искал да приложа RGB текстура към сфера и да я направя полупрозрачна. Мога да импортирам текстурата, да я приложа към сферата и да я направя полупрозрачна, но не получавам резултата, който искам.

Моята функция за смесване е glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

Моят метод на теглене е следният:

def DrawGLScene():
    rotation1  = 60
    rotation2 = 60

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glEnable(GL_BLEND)
    glLoadIdentity()
    glTranslatef(0.0, 0.0, -8.0)
    glRotatef(rotation1, 1.0, 0.0, 0.0)
    glRotatef(rotation2, 0.0, 1.0, 0.0)
    glColor4f(1.0,1.0,1.0,1.0)

    glutSolidCube(2);
    glEnable(GL_COLOR_MATERIAL)
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D,1)
    glColor4f(1.0,1.0,1.0,0.3)
    Q=gluNewQuadric()
    gluQuadricNormals(Q, GL_SMOOTH)
    gluQuadricTexture(Q, GL_TRUE)
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
    gluSphere(Q, 2.35, 32, 16)
    glDisable(GL_TEXTURE_2D)

    glutSwapBuffers()

Резултатът изглежда така:

Не виждам задната страна на сферата и артефактите по нея

Изглежда имаше проблеми с дълбочината, тъй като можех да видя задната страна на сферата само на части в долния десен ъгъл. След това зададох glDepthFunc(GL_LESS) за изчертаване на куба и glDepthFunc(GL_ALWAYS) за изчертаване на сферата, което доведе до:

Вече мога да видя гърба на сферата ПРЕЗ куба

Сега задната страна на сферата се показва през куба.

Опитах множество комбинации от glDepthFunc() за обектите, но без резултат. Проблемът свързан ли е с това как боравя с дълбочината, смесването или нещо друго?

РЕДАКТИРАНЕ:

Използването на glEnable(GL_CULL_FACE) и glCullFace(GL_BACK) в първия пример ми дава следното, което все още не е правилно, тъй като сега изобщо не можете да видите гърба на сферата.

с активирано избиване


person StuGrey    schedule 06.11.2012    source източник


Отговори (2)


Първо, glEnable(GL_CULL_FACE). Начертайте сферата веднъж с glCullFace(GL_FRONT). Начертайте куба (без изрязване). Накрая начертайте отново сферата с glCullFace(GL_BACK).

person num3ric    schedule 06.11.2012
comment
По-близо, но все още не съвсем, тъй като все още не мога да видя задната страна на сферата. Ще публикувам изображение на резултата във въпроса. - person StuGrey; 06.11.2012
comment
Може да е по-лесно да използвате текстури с алфа стойност. - person StuGrey; 06.11.2012

Имайте предвид, че смесването и тестването на дълбочината не се смесват. Винаги трябва ръчно да сортирате геометрията от далечна към близката, когато правите смесване. Независимата от общия ред прозрачност все още е до голяма степен нерешен проблем в растеризаторите.


РЕДАКТИРАНЕ: Op вече е задал функция за смесване. Трябва да зададете функция за смесване. По подразбиране е glBlendFunc(GL_ONE, GL_ZERO), което със сигурност не е това, което искате. Най-вероятно искате glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) за обикновена алфа канализирана текстура или glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) за предварително умножена алфа текстура.

person datenwolf    schedule 06.11.2012
comment
glBlendFunc() беше зададен на glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) и в двата примера. Текстурата няма алфа канал, тъй като се надявах да задам това в метода за рисуване. - person StuGrey; 06.11.2012
comment
@StuGrey: А, правилно, пропуснах това; написал си го някъде най-отгоре. Малък съвет: Винаги задавайте състояние, когато имате нужда от него. OpenGL не се инициализира! - person datenwolf; 06.11.2012