如何在opengl es 3+中获取我的离屏帧缓冲区内的底层对象的像素颜色?

Posted

技术标签:

【中文标题】如何在opengl es 3+中获取我的离屏帧缓冲区内的底层对象的像素颜色?【英文标题】:How do get the pixel color of the underlying object inside my offscreen framebuffer in opengl es 3+? 【发布时间】:2019-11-21 15:15:39 【问题描述】:

我有 2 个视觉对象,第一个包含背景图像,第二个包含信息。现在我需要第二个片段着色器中的每个像素,即第一个对象的基础颜色值。构造是使用 Qt Qml 完成的,(第一个对象 = 图像,第二个对象是 qquickframebufferobject)并且我使用延迟渲染。也许有人知道怎么去那里?

【问题讨论】:

一般情况下,您无法访问先前渲染的样本,除非它被渲染到纹理,并且您正在使用绑定的纹理进行第二次传递以进行采样。为什么你仍然需要这些信息? Alpha 混合/剪辑不足以完成您的任务吗? 谢谢弗拉德!我将使用底层像素颜色为我的像素获取对比度最高的颜色。例如。如果底层像素颜色=白色,那么我的应该是黑色的。有没有别的办法? 这不是khronos.org/registry/OpenGL/extensions/EXT/… 的用途吗? @Andrea:这正是我想要的。但是,如果我想在片段着色器中通过#extension 包含 GL_EXT_shader_framebuffer_fetch,我总是会收到错误消息“警告:不支持扩展 'GL_ARB_fragment_coord_conventions'”。我通过应用程序检查了扩展,发现只有 GL_EXT_shader_framebuffer_fetch。那么为什么存在GL_EXT_shader_framebuffer_fetch却不能使用它的特性呢? @PowerNow 这只是添加#extension 行吗?可能是您所做的其他一些更改导致了错误。 【参考方案1】:

我相信您可以为此使用 EXT_shader_framebuffer_fetch 扩展名。

在 OpenGL ES 2.x 中,用法是这样的(我知道的愚蠢的着色器,只是举例):

#extension GL_EXT_shader_framebuffer_fetch : require
precision mediump float;
void main()

    gl_FragColor = gl_LastFragData[0] * 0.5;

在 OpenGL ES 3.x 中的用法是这样的:

#version 300 es
#extension GL_EXT_shader_framebuffer_fetch : require
precision mediump float;
inout vec4 fragColor;
void main()

    fragColor = fragColor * 0.5;

【讨论】:

我尝试了两个版本,但不幸的是,我总是收到相同的消息,不支持“GL_ARB_fragment_coord_conventions”。正如您所提到的,这似乎与 Qt 设置有关。我也想知道为什么我在我的智能手机上用 opengl es +3.1 找不到这个包,可能它们已经包含在核心包中? 这是警告还是错误?如果这是一个警告,那么你可以忽略它。 这是一个警告,随后不会编译 FragShader。【参考方案2】:

从我的控制台这里...

W Camara  : QOpenGLShader::compile(Fragment): 1:2: P0003: Warning: Extension 'GL_ARB_fragment_coord_conventions' not supported
W Camara  : 4:1: P0003: Extension 'GL_EXT_shader_framebuffer_fetch' not supported
W Camara  : *** Problematic Fragment shader source code ***
W Camara  : #version 300 es
W Camara  : #ifdef GL_KHR_blend_equation_advanced
W Camara  : #extension GL_ARB_fragment_coord_conventions : enable
W Camara  : #extension GL_KHR_blend_equation_advanced : enable
W Camara  : #endif
W Camara  : #ifndef GL_FRAGMENT_PRECISION_HIGH
W Camara  : #define highp mediump
W Camara  : #endif
W Camara  : #line 1
W Camara  : #extension GL_EXT_shader_framebuffer_fetch : require

【讨论】:

以上是关于如何在opengl es 3+中获取我的离屏帧缓冲区内的底层对象的像素颜色?的主要内容,如果未能解决你的问题,请参考以下文章

离屏帧缓冲区opengl上的glGetPixels

Android OpenGL 是不是具有用于绘制位图性能的离屏功能

OpenGL 图片从文件渲染到屏幕的过程

QGLWidget 和快速的离屏渲染

opengl 渲染方式在屏 离屏 CPU

离屏渲染,OpenGL的三种渲染方式