Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL中的纹理透明度_Opengl_Transparency_Textures_Glut - Fatal编程技术网

OpenGL中的纹理透明度

OpenGL中的纹理透明度,opengl,transparency,textures,glut,Opengl,Transparency,Textures,Glut,我正在我的环境中制作一个纹理,排除所有白色像素。我在ppm文件中读取,如果是白色像素,则第四个值始终设置为0。一切似乎都井然有序,我正确地树立了我的观点等等。纹理图像在我的当前代码中是可见的,但是图像作为一个整体不是完全不透明的。它是高度透明的。这是我如何设置GL_混合的问题吗?为什么整个纹理不不透明,因为它应该只排除白色像素 前三个值作为rgb值读入,第四个值不在文件中,根据rgb中前三个数字的总值选择。该纹理不会在每次渲染时加载到显示列表中,因此仅加载一次 glPushMatrix();

我正在我的环境中制作一个纹理,排除所有白色像素。我在ppm文件中读取,如果是白色像素,则第四个值始终设置为0。一切似乎都井然有序,我正确地树立了我的观点等等。纹理图像在我的当前代码中是可见的,但是图像作为一个整体不是完全不透明的。它是高度透明的。这是我如何设置GL_混合的问题吗?为什么整个纹理不不透明,因为它应该只排除白色像素

前三个值作为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();
屏幕截图:


如果将视点移动到离树很近的位置,它是否会变得不透明?或者,如果禁用mipmapping,会发生这种情况吗

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

若要禁用mipmapping生成,必须使用glTexImage2D而不是gluBuild2DMipmaps上载纹理

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);

你也可以按照Jim Buck的建议使用

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
强制使用的最高mipmap级别为0。默认情况下,最低值为0,这将有效地禁用mipmapping。通过将“GL_纹理_最大_级别”和“GL_纹理_基本_级别”设置为相同的值,您将能够看到该特定mipmap级别的内容


所有这些都是为了确认mipmap是否有问题。

除了@bernie指出的关于GluByte数组和包括glBegin/end的问题外,问题还在于

glTexEnvf GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE


GL_调制器需要更换为GL_替换。这解决了问题。谢谢大家的帮助。

你能发布你的纹理和最终结果的截图吗?没问题。我添加了截图。树是在中间哈哈,如果它很难辨认。在确定你的顶点之前,请确认,GLCOL4F1,1, 1, 1;你的意思是把眼睛移近图像吗?如果是这样的话,就没有效果了。为什么禁用mipmapping会有什么作用?我尝试改用glTexImage2D,但它只是将mipmap的max_级别设置为零,而不生成mipmap。这只是为了确认这是一个不错的mipmap。很抱歉,我有点迷失了,因为我将如何做到这一点。glTexParameteriGL_纹理_2D,GL_纹理_基本_级别,0;GLTEX参数化GLU纹理2D,GLU纹理最大级别,0;-这实际上不会使用mipmap。呵呵,我不知道@bernie添加了那个特殊的东西
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);