Делаем текстуру полупрозрачной в 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) для рисования сферы, что привело к:

Теперь можно видеть заднюю часть сферы ЧЕРЕЗ куб»></p>

<p>Теперь обратная сторона сферы видна сквозь куб.</p>

<p>Я пробовал несколько комбинаций glDepthFunc () для объектов, но безрезультатно.  Проблема в том, как я обрабатываю глубину, смешивание или что-то еще?</p>

<p>РЕДАКТИРОВАТЬ:</p>

<p>Использование <code>glEnable(GL_CULL_FACE)</code> и <code>glCullFace(GL_BACK)</code> в первом примере дает мне следующее, что все еще неверно, поскольку теперь вы вообще не можете видеть заднюю часть сферы.</p>

<p><img src =


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