openGL之API学习(六)如何绑定深度缓冲区到片元着色器

2023-11-13

本质是使用帧缓冲区glBindFramebuffer(GL_FRAMEBUFFER, m_fbo),深度缓存是帧缓冲区的一个挂载点

在OpenGL中3d管线输出的结果称为‘帧缓冲对象‘(简称FBO)。FBO可以挂载颜色缓冲(在屏幕上显示)、深度缓冲区和一些有其他用处的缓冲区。当glutInitDisplayMode()被调用的时候,它使用一些特定的参数来创建默认的帧缓存,这个帧缓存被窗口系统所管理,不会被OpenGL删除。除了默认的帧缓存,应用程序可以创建自己的FBOs。在应用程序的控制下,这些对象可以被操作以用于不同的技术当中。

注意只有默认的帧缓存才可以在屏幕上显示。应用程序创建的帧缓存只能用于”离屏渲染“,这个可以说是一个中间的渲染过程(比如我们的阴影图缓冲区),稍后可以用于屏幕上的“真实”渲染通道。

就其本身而言,帧缓存只是一个占位符,为了使它变得可用,我们需要把纹理依附于一个或者更多的可用的挂载点,纹理含有帧缓存实际的内存空间。OpenGL定义了下面的一些附着点:

  • COLOR_ATTACHMENTi:附着到这里的纹理将接收来自片元着色器的颜色。‘i’ 后缀意味着可以有多个纹理同时被附着为颜色附着点。在片元着色器中有一个机制可以确保同时渲染多个颜色到缓冲区。
  • DEPTH_ATTACHMENT:附着在上面的纹理将收到深度测试的结果。
  • STENCIL_ATTACHMENT:附着在上面的纹理将充当模板缓冲区。模板缓冲区限制了光栅化的区域,可被用于不同的技术。
  • DEPTH_STENCIL_ATTACHMENT:这仅是一个深度和模板缓冲区的结合,因为它俩经常被一起使用。
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_FRAMEBUFFER, m_fbo);//使用应用程序定义的帧缓冲区

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_shadowMap, 0);//把深度纹理附着到帧缓冲区的深度附着点上。如果这里我们m_shadowMap使用0,那么当前的纹理(在上面的例子是深度)将从指定的附着点上脱落。


glDrawBuffer(GL_NONE);//不生成颜色,也就是禁用了片元着色器

glBindFramebuffer(GL_FRAMEBUFFER, 0);//切换回默认的帧缓冲区对象
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openGL之API学习(六)如何绑定深度缓冲区到片元着色器 的相关文章

  • OpenGL 超级采样抗锯齿?

    在办公室 我们正在使用旧的 GLX Motif 软件 该软件使用 OpenGL 的 AccumulationBuffer 来实现保存图像的抗锯齿功能 我们的问题是Apple从其所有驱动程序中删除了AccumulationBuffer 从OS
  • glGenerateMipmap 是否在 sRGB 纹理的线性空间中执行平均?

    OpenGL 3 3 规范似乎没有要求 mipmap 生成在线性空间中完成 我能找到的只有以下内容 派生的 mipmap 数组的内部格式都与 levelbase 数组和派生数组的维度如下 第 3 8 14 节中描述的要求 的内容 派生数组是
  • VBO - 没有指数化的指数化

    我正在尝试将 VBO 与元素数组缓冲区一起用于我的三角形 如下所示 glBindBuffer GL ARRAY BUFFER g Buffer 0 glVertexPointer 3 GL FLOAT 0 BUFFER OFFSET 0 g
  • OpenGL 将着色器附加到程序

    有没有办法访问附加到程序的着色器 也就是说 给定一个程序 我可以做类似的事情 vertexShader getVertexShaderFromProgram program 我想在验证我的程序的函数中记录着色器编译状态 但我只保留对程序的引
  • OpenGL Z 偏置(多边形偏移)限制

    我有两个共面的多边形 我尝试做 glEnable GL POLYGON OFFSET FILL glPolygonOffset 0 1 并期望其中一个明显 位于 另一个之上 这种情况直到大约 70 75 个单位之外 近剪裁平面为 1 远剪裁
  • 交错顶点提交如何提高性能?

    我已经阅读并看到了其他问题 这些问题通常都指向将顶点位置和颜色等交错到一个数组中的建议 因为这可以最大限度地减少从 cpu 发送到 gpu 的数据 我不清楚的是 即使使用交错数组 您仍然必须对位置和颜色指针进行单独的 GL 调用 OpenG
  • OpenGL 说“from_param 收到了一个不连续的数组”

    安装 Yosemite 后 我必须升级 numpy PyOpenGL 等 现在 以前运行的程序给了我以下堆栈跟踪 file latebind pyx line 44 in OpenGL accelerate latebind Curry c
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 即使在顶点着色器中使用,glGetUniformLocation()也会返回-1

    我正在尝试用法线渲染一个简单的立方体 我使用以下代码来初始化着色器 void initShader const char vertexShaderPath const char fragmentShaderPath cout lt lt I
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • Visual Studio 2010 中的 SOIL 设置

    我无法得到SOIL http www lonesock net soil html正确使用 Visual Studio 2010 我远非 VS 专家 但据我所知 只需执行以下步骤即可使环境正常运行 属性 gt gt C C gt 常规 gt
  • Glew+GLFW Win32 无依赖项 Visual Studio

    是否可以在不将文件复制到 C 的情况下构建并链接 Glew 和 GLFW 我找不到任何说明如何在不将 DLL 复制到 C 上的 Visual Studio 目录的情况下使用这些库的文档 我只想包含项目目录中所需的所有 dll 和 lib 文
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 使用 JOGL 和 Android OpenGL 编写可移植 Java 应用程序

    我计划编写一款可以在 PC 和 Android 上运行的 Java 3D 游戏 不幸的是 这两个平台似乎没有通用的 OpenGL API API 是否有显着差异 有没有办法在两个版本中使用相同的 3D 代码 这是不是一个好主意 Androi
  • gldrawarrays 不绘制任何东西

    我正在尝试用 VBO 绘制一个三角形 我在窗口上没有看到任何像素 我也没有看到任何 GL ERROR 这是我尝试运行的代码 include

随机推荐

  • 基于卷积的图像分类识别(六):DenseNet & FractalNet

    系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型 将持续更新 包括不仅限于 AlexNet ZFNet VGG GoogLeNet ResNet DenseNet SENet MobileNet ShuffleNet Eif
  • 注册Github账号详细教程【超详细篇--适合新手入门】

    目录 一 GitHub的简介 二 如何注册自己的GitHub账户 1 进入github的官网 2 点击右上角注册按钮sign up 来到注册页面 4 点击Continue 继续在光标处创建密码 继续创建用户名 5 进行相应的验证 点击 cr
  • JAVA2实用教程(第5版)第五章

    第5章 子类与继承 5 1子类与父类 子类只能有一个父类 5 2子类的继承 1 继承 先定义一个共有属性的一般类 父类 超类 再以此来定义具有特殊属性的子类 java不支持多重继承 2 定义子类 class 子类名 extends 父类名
  • 微信小程序添加底部导航栏+实现点击跳转代码书写

    类比大麦网的底部导航栏作为案例来书写流程 建立如下文件夹 标红为底部导航栏的导航文件夹 某些需要新建 在app json中添加如下代码 整体代码为 pages pages index index pages scene scene page
  • Linux 内核模块查看命令

    ldd命令 显示应用程序 二进制程序 所依赖的库文件 root ambari01 ldd lib64 libhandle so 1 linux vdso so 1 gt 0x0000ffff9ea70000 libc so 6 gt lib
  • 天猫精灵是干啥的

    听 听歌 听新闻 听故事 听笑话 听它发癫 查 查天气 查快递 查信息 查购物等等 控 控制智能家居 陪 娃 陪老人 陪自己解闷 看 看视频 看剧 看新闻 看综艺 纯为了摆设 看天猫精灵的颜值 好用的 1 设置早上和晚上的闹钟 可以说 天猫
  • bfs 二叉树 遍历

    bfs 遍历二叉树 之前只知道bfs 的思想以及需要使用队列来进行存储 为了更好的理解bfs 手写了bfs 遍历二叉树的两种方式 方法 一种是采用常用的递归执行 另一种是采用循环执行 使用栈来代替递归 二叉树定义 class Node ge
  • 【计算机毕设选题】计算机毕业设计选题推荐

    大四是整个大学期间最忙碌的时光 很多同学准备考研 考公 或者是需要为自己的毕业设计花费大量的时间 今天是2023年九月5号 大四的同学马上要开始毕业设计 对选题有疑问可以问我哦 详细的联系方式见文末小卡片 一 本人介绍 本人是一名95后全栈
  • 键盘事件keypress 和 keydown、keyup 的用法与区别

    KeyDown 用户摁下摁键时发生 KeyPress 用户摁下摁键 并且产生一个字符时发生 KeyUp 用户释放某一个摁键时触发 定义和用法 完整的 keypress 过程分为两个部分 1 按键被按下 2 按键被松开 当按钮被按下时 发生
  • Nginx 反向代理配置--简单入门级

    Nginx可以作为一个反向代理服务器 需要进行配置 概念 客户端发送请求到服务器 客户端认为是原始服务器 实际上是一台反向服务器 反向代理服务器接收请求并将请求转发给内部网络中的多台集群服务器 并将响应的数据返回给客户端 反向代理一般用于服
  • Ubuntu系统修复、系统安装与系统备份

    一 Ubuntu系统修复 1 正常开机无法进入图形界面 卡logo 无法进入系统图形化界面 但是ctrl alt F1 能够进入tty1命令行界面进行操作 解决办法 通过命令行进入 需要重新配置网卡 ifconfig eth0 192 16
  • C# 提取字体点阵字模数据

    MCU 项目的 GUI 需要显示文字 没找到合适的 于是 用 Visual C 2008 写了一个字模提取程序 目前能导出数据 但还没来得及测试数据正确性 项目托管地址 https github com memstone mosFontTo
  • 【Flutter 2-7】Flutter手把手教程UI布局和Widget——垂直布局控件Column

    Column Column是在Flutter中常见的布局控件 它负责垂直方向布局 Row负责水平方向布局 二者都是继承于Flex 类似于iOS里面的UIScrollView 但是又有很多不同 先来看一下Column的构造函数 Column
  • 华为OD机试 Python【数字整除】

    题目 小明正在玩一种特别的牌游戏 这个游戏的玩法如下 小明先拿到一张牌 上面有一个数字m 然后 他会依次拿到n张牌 这些牌连成一排 小明的挑战是 从这n张牌中 找到连在一起的一串牌 使它们的数字和能被m整除 你的任务 对于每一轮游戏 判断小
  • DataInputStream和DataOutputStream的基本使用

    字节流 InputStream类 OutputStream类 字符流 Reader类 Writer类 DataInputStream和DataOutputStream是一对可以直接读取基本类型数据的流 简化了对基本数据类型的读写操作 Dat
  • Java常用日志框架介绍

    Java日志概述 对于一个应用程序来说日志记录是必不可少的一部分 线上问题追踪 基于日志的业务逻辑统计分析等都离不日志 java领域存在多种日志框架 目前常用的日志框架包括Log4j 1 Log4j 2 Commons Logging Sl
  • 如何将Kali Linux中的Firefox浏览器语言设置为中文

    我们在使用kali这个工具的时候 打开Firefox浏览器 对于英文不是很好的人很不友好 那么怎么设置成中文呢 其实很简单 不用通过行也可以实现 1 首先需要打开我们的Firefox浏览器 点击这里 2 选择设置 3 找到语言设置 找到中文
  • 有哪些初学者程序员不知道的小技巧?

    提到新手程序员 大家想到的第一个词可能就是 刷题 尤其是通过LeetCode刷题 想必新手程序员们都经历过这一步 甚至不少人认为只要在LeetCode上刷的题目够多 就一定能够进阶为大神 但是 不难发现 LeetCode上的题目都是算法片段
  • Java程序员最常用的6个代码对比工具,架构师一定收藏

    Java程序员最常用的6个代码对比工具 架构师一定收藏 在Java程序开发的过程中 程序员会经常对源代码以及库文件进行代码对比 那么今天在这篇文章里我们给大家介绍六款程序员常用的代码比较工具 希望对大家会有帮助 WinMerge WinMe
  • openGL之API学习(六)如何绑定深度缓冲区到片元着色器

    本质是使用帧缓冲区glBindFramebuffer GL FRAMEBUFFER m fbo 深度缓存是帧缓冲区的一个挂载点 在OpenGL中3d管线输出的结果称为 帧缓冲对象 简称FBO FBO可以挂载颜色缓冲 在屏幕上显示 深度缓冲区