gpt4 book ai didi

opengl - glBlendFunc 禁用着色器

转载 作者:行者123 更新时间:2023-12-04 06:15:14 29 4
gpt4 key购买 nike

我有一个非常简单的着色器(只需将背景方块设置为绿色),这非常有效。
我最近添加了一些应用了纹理的四边形。这个纹理有一些 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
}

垂直着色器(非常简单):
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

片段着色器:
void main(void)
{
gl_FragColor = vec4(0.0, 0.3, 0.0, 0.0);
}

最佳答案

在您的片段着色器中,您设置颜色 (0, 0.3, 0, 0),这是一种带有 的深绿色。 0 的 alpha .启用混合和标准 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 的 alpha 是概念上正确的方式来说明您的背景是完全不透明的。

关于opengl - glBlendFunc 禁用着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335437/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com