如何在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+中获取我的离屏帧缓冲区内的底层对象的像素颜色?的主要内容,如果未能解决你的问题,请参考以下文章