首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glBlendFunc禁用着色机

glBlendFunc禁用着色机
EN

Stack Overflow用户
提问于 2011-09-07 14:17:43
回答 2查看 3.8K关注 0票数 2

我有一个非常简单的着色器(只是设置一个背景广场为绿色),这是完美的工作。

我最近添加了一些四边形的纹理应用于他们。这个纹理有一些alpha值,所以我用它来称呼它:

代码语言:javascript
复制
    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(.)线条和着色器再次出现(但我失去阿尔法混合)。然而,每当我调用该函数时,着色器似乎就停止工作了。

对为什么会发生这种事有什么想法吗?

删除glBlendFunc的图像:

使用glBlendFunc的图像:

着色加载代码:

代码语言:javascript
复制
    //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
    }

(非常简单):

代码语言:javascript
复制
void main(void)
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

框架着色器:

代码语言:javascript
复制
void main(void)
{
    gl_FragColor = vec4(0.0, 0.3, 0.0, 0.0);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-09 00:15:01

在片段着色器中设置颜色(0、0.3、0、0),这是一种深绿色,α为0。在启用混合功能和标准glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)的情况下,alpha基本上表示颜色的不透明度和0的不透明度,嗯,完全透明的背景。

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

代码语言:javascript
复制
gl_FragColor = vec4(0.0, 0.3, 0.0, 1.0);

但请记住,首先渲染你的背景,然后其他形状为他们正确地混合到背景。您也可能只是在渲染背景时禁用混合,并且只对纹理对象启用它。但是无论如何,使用α值为1在概念上是正确的,可以说你的背景完全不透明。

票数 3
EN

Stack Overflow用户

发布于 2011-09-09 00:28:24

绘制四角体的代码如下:

代码语言:javascript
复制
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

现在,对于着色四边形和纹理四边形,我使用相同的代码。然而,我从来没有加载一个纹理的着色器四,所以textureID我发送到opengl是-1。

在将代码更改为不绑定textureID (如果它是== to -1 )之后,着色器的工作方式就像它应该的那样,而且我的纹理四边形仍然是透明的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7335437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档