opengl如何获取一点的像素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl如何获取一点的像素相关的知识,希望对你有一定的参考价值。
一个一个像素的读写太慢了吧,opengl只支持一堆像素的读写。
void
glReadPixels();
glDrawPixels();
当然你用他们来读写一个像素也可以.只不过有点大材小用
void
glReadPixels(GLint
x,GLint
y,GLsizesi
width,GLsizei
height,
GLenum
format,GLenum
type,GLvoid
*pixel);
函数参数(x,
y)定义图像区域左下角点的坐标,width和height分别是图像的高度和宽度,*pixel是一个指针,指向存储图像数据的数组。参数format指出所读象素数据元素的格式(索引值或R、G、B、A值,如下面表所示),而参数type指出每个元素的数据类型(也见下面表)。
写入象素数据:
void
glDrawPixels(GLsizesi
width,GLsizei
height,GLenum
format,
GLenum
type,GLvoid
*pixel);
函数参数format和type与glReadPixels()有相同的意义,pixel指向的数组包含所要画的象素数据。注意,调用这个函数前必须先设置当前光栅位置,若当前光栅位置无效,则给出该函数时不画任何图形,并且当前光栅位置仍然保持无效。
+++++++++++像素格式表++++++++++++++++++++++
GL_INDEX
单个颜色索引
GL_RGB
先是红色分量,再是绿色分量,然后是蓝色分量
GL_RED
单个红色分量
GL_GREEN
单个绿色分量
GL_BLUE
单个蓝色分量
GL_ALPHA
单个Alpha值
GL_LUMINANCE_ALPHA
先是亮度分量,然后是Alpha值
GL_STENCIL_INDEX
单个的模板索引
GL_DEPTH_COMPONENT
单个深度分量
++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++
数据类型+++++++++++++++++++
GL_UNSIGNED_BYTE
无符号的8位整数
GL_BYTE
8位整数
GL_BITMAP
无符号的8位整数数组中的单个数位
GL_UNSIGNED_SHORT
无符号的16位整数
GL_SHORT
16位整数
GL_UNSIGNED_INT
无符号的32位整数
GL_INT
32位整数
GL_FLOAT
单精度浮点数
+++++++++++++++++++++++++++++++++++++++
图像的每个元素按上面表给出的数据类型存储。若元素表示连续的值,如红、绿、蓝或亮度分量,每个值都按比例放缩使之适合于可用的位数。例如,红色分量是0.0到1.0之
间的浮点值。若它需要放到无符号单字节整数中,也仅有8位精度保存下来,其他无符号整数类型同理。对于有符号的数据类型还要少一位,例如颜色索引存到有符号的8位整数中,它的第一位被0xfe屏蔽掉了(即这个掩码包含7个1)。若类型是GL_FLOAT,索引值简单地转化成单精度浮点值,例如索引17转化成17.0,同理。 参考技术A 建议你检查一下glReadPixels的返回值
你给的代码比较少,没办法保证前面的代码没问题
int
ret=glGetError();
cout<
评论
0
0
加载更多本回答被提问者采纳
如何在opengl es 3+中获取我的离屏帧缓冲区内的底层对象的像素颜色?
【中文标题】如何在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如何获取一点的像素的主要内容,如果未能解决你的问题,请参考以下文章
如何在opengl es 3+中获取我的离屏帧缓冲区内的底层对象的像素颜色?