我如何读取浮动数据与glReadPixels
How can I read float data with glReadPixels
我一直试图读取浮动数据几天与glReadPixels
。
我的cpp代码:
//expanded to whole screen quad via vertex shader
glDrawArrays( GL_TRIANGLES, 0, 3 );
int size = width * height;
GLfloat* pixels = new GLfloat[ size ];
glReadPixels( 0, 0, width, height, GL_RED, GL_FLOAT, pixels );
pixelVector.resize( size );
for ( int i = 0; i < size; i++ ) {
pixelVector[i] = (float) pixels[i];
}
和我的着色器代码:
out float data;
void main()
{
data = 0.02;
}
奇怪的是,我得到0.0196078作为输出。但当数据为0.2时,一切都很好。如果data是0.002,那就全是0。是什么原因导致的呢?
这是由于您将浮点值存储在规范化的整数中,然后将其读取并将其转换为浮点值。
除非你使用的是一个framebuffer对象,否则你当前的framebuffer很可能就是你从OpenGL上下文中得到的。它可能使用GL_RGBA8
作为图像格式。这是每个通道8位,无符号和标准化,存储为整数。因此,您编写的浮点值被限制在[0,1]范围内,然后通过乘以255并舍入将其转换为整数,然后存储。
当你把它作为浮点数读回时,转换是反向进行的:整数值被转换成浮点数,除以255,然后返回。
0.02 * 255 = 5.1 ~= 5
5 / 255 = 0.0196
这就是你得到的。
如果你想从你的片段着色器中写一个浮点值,实际上从你读回来的东西中得到超过2-3个数字的精度,那么你需要渲染到一个包含合理图像格式的图像的FBO。例如浮点图像(GL_R16F
或GL_R32F
,因为您只写入一个数据通道)。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 使用glReadPixels时是否可以不固定数据?
- glReadPixels更改缓冲区数据
- 将数据从glReadPixels()转换为OpenCV::Mat
- 我如何读取浮动数据与glReadPixels