glBlendFunc禁用着色器

时间:2011-09-07 14:17:43

标签: opengl glsl glblendfunc

我有一个非常简单的着色器(只是将背景方块设置为绿色),这非常有效 我最近添加了一些应用了纹理的四边形。这个纹理有一些alpha值,所以我用它来调用它:

    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, textureID);

    //draw quad

    glDisable(GL_TEXTURE_2D); 
    glBlendFunc (GL_ONE, GL_ZERO);
    glDisable (GL_BLEND);
    glBindTexture(GL_TEXTURE_2D, 0); //remove texture

四边形显示透明度很好 - 但背景中的着色器现在已经消失了。它仍在被绘制,但它没有显示。

现在我删除了两个glBlendFunc(...)行,然后再次出现着色器(但我失去了alpha混合)。 但是,每当我调用该函数时,着色器似乎就会停止工作。

关于为什么会发生这种情况的任何想法?

删除了glBlendFunc的图片:
glBlendFunc

使用了glBlendFunc的图像:
glBlendFunc removed

着色器加载代码:

    //create shaders
    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    //grab the char so we can send it to gfx card
    const char* vShadData = loadFile(vertexShaderFile);
    const char* fShadData = loadFile(fragShaderFile);

    //send data to gfx card
    glShaderSource(vertexShader, 1, (const GLchar **)&vShadData, NULL);
    glShaderSource(fragmentShader, 1, (const GLchar **)&fShadData, NULL);

    //check if compiled
    GLint compiled;

    glCompileShader(vertexShader);
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled);
    if(compiled==FALSE)
    {
        //doesn't get here
    }
    glCompileShader(fragmentShader);
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compiled);
    if(compiled==FALSE)
    {
        //doesn't get here
    }

    //finally, create shader program
    shaderProgram = glCreateProgram();

    //attach shaders to program
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);

    glLinkProgram(shaderProgram);

    GLint linkStatus;
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, (GLint *)&linkStatus);
    if(linkStatus==FALSE)
    {
        //doesn't get here
    }

Vert Shader(非常简单):

void main(void)
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Frag Shader:

void main(void)
{
    gl_FragColor = vec4(0.0, 0.3, 0.0, 0.0);
}

2 个答案:

答案 0 :(得分:3)

在片段着色器中设置颜色(0,0.3,0,0),这是一种深绿色, alpha为0 。启用混合后,标准glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) alpha表示颜色的不透明度,0的不透明度表示完全透明的背景。

所以只需将背景的alpha更改为1,您就应该再次看到它。

gl_FragColor = vec4(0.0, 0.3, 0.0, 1.0);

但请记住先渲染背景,然后再将其他形状渲染到背景中。您可能还会在渲染背景时禁用混合,并仅为纹理对象启用它。但无论如何使用α为1是概念上正确的方式来说明你的背景是完全不透明的。

答案 1 :(得分:0)

绘制四边形的代码如下:

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureID);

glBegin(GL_TRIANGLE_FAN);
    glTexCoord2f(0.0f, 0.0f);
    glVertex2f(-1.0f, 1.0f);    
    glTexCoord2f(1.0f, 0.0f);
    glVertex2f( 1.0f, 1.0f);
    glTexCoord2f(1.0f, 1.0f);
    glVertex2f( 1.0f,-1.0f);
    glTexCoord2f(0.0f, 1.0f);
    glVertex2f(-1.0f,-1.0f);
glEnd();
glDisable(GL_TEXTURE_2D); 
glBlendFunc (GL_ONE, GL_ZERO);
glDisable (GL_BLEND);
glBindTexture(GL_TEXTURE_2D, 0); //remove texture

现在对于着色器四边形和纹理四边形,我使用相同的代码。但是,我从不为着色器四边形加载纹理,因此我发送给opengl的textureID是-1 在将此代码更改为NOT绑定textureID(如果它是==到-1)之后,着色器按照它应该的方式工作,并且我仍然在我的纹理四边形上获得透明度。

然而,Christian Rau的回答在我的代码中发现了一个错误 - 这可能是导致失败的主要原因。