Прозрачность текстур в OpenGL - PullRequest
0 голосов
/ 03 декабря 2011

Я создаю текстуру в моей среде, которая исключает все белые пиксели. Я читаю в ppm-файле, и четвертое значение всегда равно 0, если это белый пиксель. Кажется, все в порядке, я правильно настроил свой взгляд и так далее. Изображение текстуры видно с моим текущим кодом, однако изображение в целом не полностью непрозрачно. Это очень прозрачно. Это проблема с тем, как я настраиваю свой GL_Blend? Почему вся текстура не является непрозрачной, как должно быть, за исключением белых пикселей?

первые три значения считываются как значения rgb, а четвертое значение отсутствует в файле, оно выбирается в зависимости от общего значения трех предыдущих чисел из rgb. Эта текстура не загружается каждый раз, когда я рендеринг, она находится в списке отображения, поэтому делается только один раз.

glPushMatrix();

    FILE *inFile3;
    char dump3[3];
    int max3, k3 = 0;

    inFile3 = fopen("tree.ppm", "r");
    int x3;
    int y3;

    fscanf(inFile3, "%s", dump3);
    fscanf(inFile3, "%d %d", &x3, &y3);


    fscanf(inFile3, "%d", &max3);
    int arraySize3 = y3*(4*x3);
    int pixel3, rgb = 0;
    GLubyte data3[arraySize3];

    for (int i = 0; i < x3; i++) {
        for (int j = 0; j < y3; j++) {
            fscanf(inFile3, "%d", &pixel3);
            data3[k3++] = pixel3;
            rgb += pixel3;

            fscanf(inFile3, "%d", &pixel3);
            data3[k3++] = pixel3;
            rgb += pixel3;

            fscanf(inFile3, "%d", &pixel3);
            data3[k3++] = pixel3;
            rgb += pixel3;

            data3[k3++] = ((rgb) > 760) ? 0 : 255;
            rgb = 0;
        }
    }


    fclose(inFile3);

    glGenTextures(1,&texture3);
    glBindTexture(GL_TEXTURE_2D,texture3);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);


    gluBuild2DMipmaps(GL_TEXTURE_2D,4,x3,y3,GL_RGBA,GL_UNSIGNED_BYTE,data3);


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

    glEnable( GL_TEXTURE_2D );
    glBindTexture( GL_TEXTURE_2D, texture3 );
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

    glRotatef(180, 0, 0, 0);
    glTranslatef(0, -19, 0);

    glBegin(GL_QUADS);

    glTexCoord2d(0,0); glVertex3f(30,0,10);
    glTexCoord2d(0,1); glVertex3f(30,20,10);
    glTexCoord2d(1,1); glVertex3f(30,20,-10);
    glTexCoord2d(1,0); glVertex3f(30,0,-10);

    glEnd();

    glDisable(GL_TEXTURE_2D);
    glDisable(GL_BLEND);
    glPopMatrix();

Снимки экрана: Tree is not solid

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 декабря 2011

В дополнение к тому, что @bernie указал на массивы GluByte, включая glBegin / end, проблема была в ..

glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

GL_MODULATE необходимо заменить на GL_REPLACE. Это решило проблему. Спасибо за помощь ваших парней.

0 голосов
/ 03 декабря 2011

Если вы переместите точку обзора действительно близко к дереву, станет ли она непрозрачной? Или это если вы отключите mipmapping?

редактировать

При перемещении глаза ближе к дереву, используется mipmap уровня 0 (ваше исходное изображение). Чтобы выбрать mipmap, OpenGL вычисляет, какой уровень обеспечивает наилучшее соответствие между размером его текселей и размером пикселя.

Чтобы отключить создание mipmapping, вы должны использовать glTexImage2D для загрузки вашей текстуры вместо gluBuild2DMipmaps.

Чтобы отключить использование mipmaps, измените следующую строку

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);

до

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

Вы также можете сделать, как предлагает Джим Бак, и использовать

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);

, чтобы принудительно установить наивысший использованный уровень mipmap равным 0. Наименьшее значение по умолчанию 0, это фактически отключает mipmapping. Установив GL_TEXTURE_MAX_LEVEL и GL_TEXTURE_BASE_LEVEL в одно и то же значение, вы сможете увидеть содержимое этого определенного уровня mipmap.

Все это для подтверждения проблем с мипмапами.

...