openGL之API学习(三十七)如何从FBO中读取颜色、深度信息

2023-11-03

方法一、保存成图片

QImage* img=new QImage(WINDOW_WIDTH,WINDOW_HEIGHT,QImage::Format_ARGB32);
    uchar* tmpBIT = img->bits();


    //从颜色缓冲区中读取数据
    int tmpPixelSize = WINDOW_WIDTH*WINDOW_HEIGHT * 4;
    char* tmpPixelsBuffer = (char*)malloc(tmpPixelSize);
    glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,GL_RGBA, GL_UNSIGNED_BYTE, tmpPixelsBuffer);
    for (int y = WINDOW_HEIGHT-1; y >=0 ; y--)
    {
        for (int x = 0; x < WINDOW_WIDTH; x++)
        {

            //蓝色
            tmpBIT[0] = tmpPixelsBuffer[(y*WINDOW_WIDTH + x) * 4 + 2];
            //绿色
            tmpBIT[1] = tmpPixelsBuffer[(y*WINDOW_WIDTH + x) * 4 + 1];
            //红色
            tmpBIT[2] = tmpPixelsBuffer[(y*WINDOW_WIDTH + x) * 4 + 0];
            tmpBIT[3] = 100;//不起作用
            tmpBIT += 4;
        }
    }

    //从深度缓冲区读取数据
    int tmpPixelSize = WINDOW_WIDTH*WINDOW_HEIGHT;
    float* tmpPixelsBuffer = new float[ tmpPixelSize ];
    //GLfloat* tmpPixelsBuffer = new GLfloat[ tmpPixelSize ];
    //glReadBuffer(GL_NONE);
    //glReadBuffer(GL_BACK);
    glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,GL_DEPTH_COMPONENT, GL_FLOAT, tmpPixelsBuffer);

    GLenum aaa = glGetError();
    for (int y = WINDOW_HEIGHT-1; y >=0 ; y--)
    {
        for (int x = 0; x < WINDOW_WIDTH; x++)
        {
            float iii=tmpPixelsBuffer[(y*WINDOW_WIDTH + x)  + 0];
            iii*=255;
            //蓝色
            tmpBIT[0] = iii;
            //绿色
            tmpBIT[1] = iii;
            //红色
            tmpBIT[2] = iii;
            tmpBIT[3] = 255;//不起作用
            tmpBIT += 4;
        }
    }


    img->save("a.jpg");

方法二、输出到纹理

1、配置FBO,使颜色、深度输出到纹理

    glGenFramebuffers(1, &m_fbo);

    // Создаем буфер глубины
    glGenTextures(1, &m_shadowMap);
    glBindTexture(GL_TEXTURE_2D, m_shadowMap);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, WindowWidth, WindowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
                           m_shadowMap, 0);


    //增加一个颜色缓冲区
    glGenTextures(1, &m_shadowColor);
    glBindTexture(GL_TEXTURE_2D, m_shadowColor);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WindowWidth, WindowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
                           m_shadowColor, 0);
    glDrawBuffer(GL_COLOR_ATTACHMENT0);



    // 不允许读写颜色缓冲区,也会禁用片元着色器
    //glDrawBuffer(GL_NONE);
    //glReadBuffer(GL_NONE);

    GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

    if (Status != GL_FRAMEBUFFER_COMPLETE){
        printf("FB error, status: 0x%x\n", Status);
        return false;
    }
    return true;

2、在默认帧缓冲区(或其他帧缓冲区)使用纹理

    glActiveTexture(TextureUnit);
    glBindTexture(GL_TEXTURE_2D, m_shadowMap);

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openGL之API学习(三十七)如何从FBO中读取颜色、深度信息 的相关文章

  • Opengl 视频纹理

    我正在使用 Visual Studio 10 在 Windows 上用 C 开发 opengl 应用程序 目前我在立方体上使用静态纹理 但我想集成视频纹理 你知道我可以使用哪个库来打开和解密视频吗 查看 ffmpeg libavformat
  • 如何计算正切和副法线?

    谈谈OpenGL着色语言 GLSL 中的凹凸贴图 镜面高光之类的东西 I have 顶点数组 例如 0 2 0 5 0 1 0 2 0 4 0 5 法线数组 例如 0 0 0 0 1 0 0 0 1 0 0 0 世界空间中点光源的位置 例如
  • OpenGL:始终相同的颜色

    我正在 Windows 上编写一个程序 使用c opengl 2 1 and SDL我在顶点颜色方面遇到了一些问题 我在用着glColor3f设置每个顶点集的颜色 但它似乎不起作用 无论我选择什么颜色 我都会将每个顶点绘制为红色 我检查了传
  • 按像素值偏移 gl_Position 或 gl_Vertex

    我的属性包含像素值 我想用这个属性值来偏移我的 gl vertex 问题是我的 gl vertex 以世界单位为单位 而 offset attribute 以像素为单位 如果我将屏幕尺寸作为统一发送 然后将像素转换为 1 到 1 值 并将其
  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • 如何为 glDrawElements() 指定每个图元的颜色

    我想渲染一个索引几何体 所以 我有一堆顶点和关联的排序索引 我在用glDrawElements 渲染 2 个四边形 如下所示 现在 我知道我可以使用glColorPointer 用于指定每个顶点的颜色 我的问题是 我可以指定吗每个基元的颜色
  • 渲染到一个颜色通道而不影响其他通道

    使用 OpenGL 任何版本 如何通过一次仅影响一个颜色通道来渲染到帧缓冲区对象 例如 我的帧缓冲区对象具有 GL BGRA 布局 现在我想执行一些渲染命令 这些命令应该只改变红色通道 因此 如果片段用颜色 204 0 0 0 渲染并且像素
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 如何在OpenGL中像这样绘制连接的带状线

    我想用以下方式绘制一系列连接线 GL LINE STRIP 我尝试过自己编写代码 但没有得到想要的结果 所以我来到这里 帮助我找出我错在哪里 这里我只给出我的draw 函数 glBegin GL LINE STRIP glVertex2f
  • GPU-android opengl es 3.0中的亮度直方图计算

    用于亮度直方图计算 我使用了 Brad Larson 的 GPU image ios 项目中的代码 他使用混合进行直方图计算 连接顶点和片段着色器 顶点着色器 version 300 es in vec4 position out vec3
  • WGL:没有双缓冲 + 多重采样 = 失败?

    我通常使用创建像素格式wglChoosePixelFormatARB 与这些论点 除其他外 WGL DOUBLE BUFFER ARB GL TRUE WGL SAMPLE BUFFERS ARB GL TRUE WGL SAMPLES A
  • 在着色器中旋转法线

    我有一个场景 其中有多个具有各自位置和旋转的模型 给定法线 着色器对每个像素应用简单的双向照明 那是我的顶点着色器 version 150 in vec3 position in vec3 normal in vec2 texcoord o
  • Windows 上的 OpenGL SDK

    我正在尝试编写一个 OpenGL 应用程序 因此我安装了 Windows 7 SDK 然而 它似乎是OpenGL 1 1 define GL VERSION 1 1 1 如何找到我安装的 OpenGL 版本 dll 以及在哪里可以找到较新的
  • 如何在片段着色器中将 gl_FragCoord 转换为世界空间点?

    我的理解是 如果您有视图投影矩阵 屏幕宽度和屏幕高度的逆矩阵 则可以将 gl FragCoord 转换为片段着色器中世界坐标中的点 首先 你转换gl FragCoord x and gl FragCoord y通过分别除以宽度和高度 然后将
  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • 如何创建自己的 openGL 上下文并将其绑定到 GLCanvas?

    所以当我开始掌握java时 paint Graphics g 我继续创建自己的渲染方法 但我必须了解缓冲区策略以及如何 获取 图形 所以现在我在学习openGL 我必须掌握方法 Override public void display GL
  • nVidia 和 ATI 之间的 OpenGL 渲染差异

    最近 我将 ATI 驱动程序 我使用的是 HD7970 更新为最新版本 但我的 OpenGL 项目的一些对象停止工作 更重要的是 他们适用于 nVidia 最新驱动程序 在 960m 上测试 ATI 和 nVidia 渲染管道之间有什么我应
  • OpenGL 新手: glutMouseFunc

    我试图在单击鼠标后更改球体位置 但在使用 glutMouseFunc 中的 x 和 y 时它不起作用 以下是代码 include stdafx h include
  • 计算着色器中的 Image2D

    我想使用 image2D 作为顶点的 2D 存储 该顶点将由计算着色器修改 但不起作用 创建纹理 glGenTextures 1 HeightMap glBindTexture GL TEXTURE 2D HeightMap glTexIm
  • 光照不适用于 gluSphere

    这是一个简单的问题 我有点羞于寻求帮助 我正在对 gluSphere 进行简单调用来渲染球体 但是 即使我很确定我正确添加了法线和照明 它也无法正确照亮 但是 如果我添加纹理 模型会正常点亮 但它似乎总是平滑的 并且我无法将其更改为平面 这

随机推荐

  • 入门级题解14. 最长公共前缀

    题目 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 解题思路 比较 比较 挨个比较 横向比较实现过程 我有一个问题就是喜欢新设变量 之前链表也是 直接用题目中的 这里也是 先用s1做最长公共子串 第一步之后
  • 【代码审计】51 PHP项目类 RCE 文件包含和下载

    runaway xhcms 无框架 文件包含跨站 搜索或应用 include 找核心代码分析 通过搜索关键字echo 测试XSS漏洞 测试文件包含漏洞 earmusic 无框架 文件下载 搜索或应用功能 down 根据程序实现的功能猜测可能
  • Docker(12)CIG容器重量级监控系统

    文章目录 CIG是啥 CAdvisor 监控工具 InfluxDB Granfana CIG写入compose编排 CIG是啥 CAdvisor InfluxDB Granfana CIG CAdvisor 监控工具 CAdvisor是一个
  • How to print a c++ object members using GDB from an address if the object's class type is like A::B

    How to print a c object members using GDB from an address if the object s class type is like A B duplicate linux How to
  • vue的创建问题和axios问题

    文章思路来源于网络以及自己的尝试和理解 使用命令行执行vue相关的npm命令的前提 下载nodejs 版本不要太旧 下载nodejs时会自动下载npm的相关的包 并在安装nodejs时注意环境变量 特别时对npm的环境变量的添加 的添加 v
  • 【Nginx 】nginx的正则表达式

    1 nginx配置基础 1 正则表达式匹配 区分大小写匹配 不区分大小写匹配 和 分别为区分大小写不匹配及不区分大小写不匹配 以什么开头的匹配 以什么结尾的匹配 转义字符 可以转 等 代表任意字符 2 文件及目录匹配 f和 f用来判断是否存
  • AS608指纹识别模块+STM32实现指纹录入

    视频演示 d9148ed412b24119db81eef6c2c8e9ec 1 特性参数 资料来自ALIENTEK文档 ATK AS608 指纹识别模块是 ALIENTEK 推出的一款高性能的光学指纹识别模块 ATK AS608 模块采用了
  • git 下拉使用方法

    1 新建文件 新建的文件是用来关联远程仓库 可进行下拉和上传操作 新建的方法有很多中 选择一种自己认为比简单的即可 2 通过文件打开git bash 用鼠标右键点击所需文件 点击 git bash here 选项 打开后出现 gitC Us
  • 五款拿来就能用的炫酷表白代码

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 小白零基础 Python入门到精通 五款炫酷表白代码 1 无限弹窗表白 2 做我女朋友好吗 不同意就关机 3 爱心发
  • 12.网络爬虫—线程队列详讲(实战演示)

    网络爬虫 线程队列详讲与实战 线程 队列 Queue模块介绍 线程和队列的关系 生产者消费者模式 实战演示 王者荣耀照片下载 使用生产者消费者模式 前言 个人简介 以山河作礼 Python领域新星创作者 CSDN实力新星认证 第一篇文章 1
  • angular2 组件的生命周期钩子

    按照生命周期执行的先后顺序 Angular生命周期接口如下所示 名称 时机 接口 范围 ngOnChanges 当被绑定的输入属性的值发生变化时调用 首次调用一定会发生在 ngOnInit之前 OnChanges 指令和组件 ngOnIni
  • Open3D 手动裁剪点云

    目录 一 概述 1 主要函数 2 基础操作 二 代码实现 三 结果展示 四 相关链接 一 概述 Open3d中的VisualizerWithEditing类提供了图形用户交互功能 draw geometries with editing p
  • Java 线程创建方法

    除了继承Thread 实现Runnable Callable三种创建线程方式外的第四种创建方式 实现java util concurrent ThreadFactory接口 实现newThread Runnable r 方法 这种方式应用于
  • 线上CPU飙升排查

    背景 cpu idle下降50 full gc触发线上报警 处理 1 top命令 查看所有进程占用CPU的排序 第一个就是我们的java服务进程 或者jps命令直接查看java服务进程 2 top Hp 46845 查看进程下所有线程占用C
  • 区块链入门之windows 安装以太坊 ethereum 客户端 (win7-64)

    以太坊 Ethereum 是一个运行智能合约的去中心化平台 Platform for Smart Contract 平台上的应用按程序设定运行 不存在停机 审查 欺诈 第三方人为干预的可能 以太坊平台由 Golang C Python 等多
  • Tomcat部署服务器添加多个<Host>就加载多次项目问题《解决方案》

    如题 项目部署到阿里云服务器之后 配置tomcat一个域名同时又可以使用IP直接访问项目 配置是如下
  • vue-router详解 - 从使用到扩展

    1 认识路由 1 1 后端路由 早期的网站开发整个HTML页面是由服务器来渲染的 服务器直接生产渲染好对应的HTML页面 返回给客户端进行展示 但是 一个网站 这么多页面服务器如何处理呢 一个页面有自己对应的网址 也就是URL URL会发送
  • Pychram:踩坑记录/窍门分享

    Debug Console 当使用PyCharm的Debug模式时 最好用的莫过于Debug Console 它与断点相配合可以实现类似于Jupyter Notebook的逐块运行代码的效果 但是今天我突然发现Debug Console无法
  • 用户体验式UI设计

    用户体验式UI设计 1 什么是用户体验式设计 产品的业务化和易用性始终是我们追求的目标 随着 Net Framework 3 0的推出 Windows Presentation Foundation WPF 组件库把用户UI
  • openGL之API学习(三十七)如何从FBO中读取颜色、深度信息

    方法一 保存成图片 QImage img new QImage WINDOW WIDTH WINDOW HEIGHT QImage Format ARGB32 uchar tmpBIT img gt bits 从颜色缓冲区中读取数据 int