Все полигоны становятся прозрачными, как исправить? - PullRequest
1 голос
/ 06 мая 2019

Я сделал что-то в своем проекте, и все поли стали прозрачными.

Я скачал свой старый мерзавец, там все было хорошо, но он все еще прозрачен.

Тиковое событие: В рендеринге все рисунки поли

    public void render() { 
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
       glClearColor(0.925f, 0.98f, 0.988f, 1f);

       glPushMatrix();

       game.render();

       glPopMatrix();
   }

Последняя измененная функция:

public void drawModel(Vector3f camLocation) {

        for (int i = 0; i < count; i++) {

            glPushMatrix();
            glTranslated(copies[i].x, copies[i].y, copies[i].z);
            glRotatef(rotations[i], 0, 1, 0);

            texture.bind();
            glEnable(GL_TEXTURE_2D);
            glBegin(GL_TRIANGLES);

            if (Stereometry.getVectorLenght(camLocation, copies[i]) < lodRange) {
                k = 0;
            } else {
                k = m.length - 1;
            }
            for (Model.Face face : m[k].getFaces()) {

                //Первая точка
                Vector3f n1 = m[k].getNormals().get(face.getNormalIndices()[0] - 1);
                glNormal3f(n1.x, n1.y, n1.z);
                if (m[k].hasTextureCoordinates() && hasText) {
                    Vector2f t1 = m[k].getTextureCoordinates().get(face.getTextureCoordinateIndices()[0] - 1);
                    glTexCoord2f(t1.x, t1.y);
                }
                Vector3f v1 = m[k].getVertices().get(face.getVertexIndices()[0] - 1);
                glVertex3f(v1.x * scale, v1.y * scale, v1.z * scale);

...2 More Vertex...

            glEnd();
            glDisable(GL_TEXTURE_2D);
            glRotatef(-rotations[i], 0, 1, 0);
            glTranslated(-copies[i].x, -copies[i].y, -copies[i].z);
        }

    }

Как это выглядит: https://yadi.sk/i/D7XQhyBICB6sug

1 Ответ

2 голосов
/ 06 мая 2019

Если текстурирование включено, то по умолчанию цвет текселя умножается на текущий цвет, потому что по умолчанию режим текстурной среды (GL_TEXTURE_ENV_MODE) равен GL_MODULATE. См glTexEnv.

Это приводит к тому, что цвет и альфа-канал текселей текстуры «смешиваются» с последним цветом, который был установлен glColor4f.

Установите «белый» цвет и альфа-канал 1 перед рендерингом текстуры, чтобы решить вашу проблему:

glColor4f(1, 1, 1, 1);

Обратите внимание, что если текущий цвет имеет альфа-канал ниже 1 и Смешивание включено, это может вызвать неожиданный эффект прозрачности.

Альтернативным решением было бы изменить режим среды на GL_REPLACE вместо:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
...