c++ - OpenGL ES 2.0 : paint in FBO + Texture = gray blending in texture

标签 c++ ios objective-c opengl-es glsles

这就是我在片段着色器中渲染画笔的方式:

gl_FragColor.rgb = Color.rgb;
gl_FragColor.a = Texture.a * Color.a;

在 (0, 0, 0, 0) 纹理上使用此混合函数:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这是我使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 将我的纹理添加到我的白色背景时看到的:

My stroke well viewed

但这就是我在纹理中得到的:

Wrong blending in texture

谁能帮我理解为什么我的纹理中有这个灰色笔划?因为我需要截取这个纹理的屏幕截图,并且我想要具有相同的渲染但没有白色背景。

  • [第一张图片] 当我绘制“ View ”时,我有一个白色背景
  • [第二张图片] 但是我将笔画存储在具有透明背景的纹理中

最佳答案

您正在执行两种混合操作,一种在您的着色器中,一种使用 glBlendFunc 调用。当直接渲染到屏幕时,它不会第二次应用 glBlendFunc,但是,当渲染到纹理时,它会在渲染到纹理时应用,然后在将纹理渲染到屏幕时再次应用.

您有两个选择,1) 不混合着色器,2) 使用不同的混合函数(我发现 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 效果很好)。我发现选项 2 最适合我,处理 OpenGL 混合函数是出了名的烦人。

关于c++ - OpenGL ES 2.0 : paint in FBO + Texture = gray blending in texture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32400083/

相关文章:

php - AFNetworking 解析 JSON url 图像错误

php - 连接到数据库只发送一个字 iOS

c++ - MFC 绘制的元素在 30-60 分钟后发生变化

c++ - 使用 C++ QT 创建一个 ListView

c++ - 从文件中读取字节到数组变量 C++

ios - UIWebView 和 UIScrollView 滚动行为

c++ - 取消引用临时的 unique_ptr

ios - 线程池 : DispatchQueue. main.async

objective-c - 类型转换类类型

ios - 如何指定 NSPredicate 来匹配不以字母开头的字符串?