OpenGL中的纹理透明度

时间:2011-12-02 22:21:41

标签: opengl transparency textures glut

我在我的环境中制作了一个排除所有白色像素的纹理。我在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 :(得分:0)

如果您将视点移动到树附近,它会变得不透明吗?或者如果你禁用mipmapping呢?

修改

通过将眼睛移近树,使用0级mipmap(原始图像)。要选择一个mipmap,OpenGL会计算哪个级别的纹素大小和像素大小之间的最佳匹配。

要停用代码生成,您必须使用glTexImage2D上传纹理而不是gluBuild2DMipmaps

要禁用mipmap的使用,请更改以下行

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

您也可以像Jim Buck建议并使用

那样做
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);

强制使用最高的mipmap级别为0.默认情况下最低为0,这有效地禁用了mipmapping。通过将GL_TEXTURE_MAX_LEVEL和GL_TEXTURE_BASE_LEVEL设置为相同的值,您将能够看到该特定mipmap级别的内容。

这一切都是为了确认mipmap是否有问题。

答案 1 :(得分:0)

除了@bernie指出的关于GluByte数组和glBegin / end的内容之外,问题出在..

  

glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

需要用GL_REPLACE替换GL_MODULATE。这解决了这个问题。谢谢你们的帮助。