OpenGL 通过 FBO 渲染到纹理 -- 不正确的显示与正常纹理

2024-02-07

离屏渲染到纹理绑定的离屏帧缓冲区对象应该是微不足道的,但我遇到了一个问题,我无法理解。

我的完整示例程序(目前仅限 2D!)在这里:

http://pastebin.com/hSvXzhJT http://pastebin.com/hSvXzhJT

请参阅下面的一些描述。

我正在创建一个 rgba 纹理对象 512x512,将其绑定到 FBO。此时不需要深度或其他渲染缓冲区,严格来说是 2D。

以下极其简单的着色器渲染到该纹理:

顶点着色器:

varying vec2 vPos; attribute vec2 aPos;
void main (void) {
    vPos = (aPos + 1) / 2;
    gl_Position = vec4(aPos, 0.0, 1.0);
}

在 aPos 中,这只是获得一个包含四边形 4 个 xy 坐标的 VBO (-1, -1 :: 1, -1 :: 1, 1 :: -1, 1)

因此,尽管理论上帧缓冲区分辨率应为 512x512,但显然着色器将其“纹理”渲染到“全(离)屏四边形”上,遵循 GLs -1..1 坐标范例。

片段着色器:

varying vec2 vPos;
void main (void) {
    gl_FragColor = vec4(0.25, vPos, 1);
}

因此,它设置完全不透明的颜色,红色固定为 0.25,绿色/蓝色取决于 0 到 1 之间的任何位置的 x/y。

此时,我的假设是渲染 512x512 纹理,仅显示 -1..1 全(离)屏四边形,从 0..1 开始对绿色/蓝色进行片段着色。

这就是我的屏外设置。在屏幕上,我有另一个真实可见的全屏四边形,带有 4 个 xyz 坐标 { -1, -1, 1 ::: 1, -1, 1 ::: 1, 1, 1 ::: -1, 1, 1}。再说一遍,现在这是二维的,所以没有矩阵,所以 z 始终为 1。

这个四边形由不同的着色器绘制,简单地渲染给定的纹理,教科书 GL-101 风格。在上面链接的示例程序中,我有一个简单的布尔切换 doRtt,当这是 false(默认值)时,根本不执行渲染到纹理,并且该着色器仅显示使用当前目录中的texture.jpg。

这个 doRtt=false 模式表明第二个屏幕四渲染器对于我当前的要求是“正确的”,并按照我想要的方式执行纹理:垂直重复两次和水平两次(稍后将被夹紧,重复仅用于测试)此处),否则不进行纹理过滤或 mipmap 缩放。

因此,无论窗口(以及视口)的大小如何调整,我们总是会看到一个全屏四边形,其中单个纹理在水平方向上重复两次,垂直方向上重复两次。

现在,在 doRtt=true 的情况下,第二个着色器仍然可以完成其工作,但纹理永远不会完全正确地缩放或绘制,这一点我不确定,因为不幸的是我们不能只是说“嘿 gl 将此 FBO 保存到磁盘以供使用”调试目的”。

RTT 着色器确实执行一些部分渲染(或者可能是完整渲染,再次无法确定屏幕外发生了什么...)特别是当您将视口大小调整为比默认大小小很多时,您会看到纹理之间的中断重复,并且并未真正显示我们非常简单的 RTT 片段着色器预期的所有颜色。

(A) 要么: 512x512 纹理已正确创建,但我的代码未正确映射(但为什么 doRtt=false 任何给定的texture.jpg 文件使用完全相同的简单纹理四元着色器显示得很好?)

(B) 或:512x512 纹理未正确渲染,并且 rtt frag 着色器以某种方式根据窗口分辨率更改其输出 - 但为什么呢?对于 x 和 y,离屏四边形始终为 -1..1,顶点着色器始终将其映射到片段坐标 0..1,对于这个简单的测试,RTT 纹理始终保持在 512x512!

请注意,屏幕外四边形和屏幕上四边形都不会更改其坐标,并且始终为“全屏”(两个维度均为 -1..1)。

再说一遍,这应该是这么简单。我到底错过了什么?

规格:OpenGL 4.2(但代码显然不需要任何 4.2 功能!)、Nvidia Quadro 5010M、openSuse 12.1 64 位、Golang Weekly 22-Feb-2012。


首先 - 尝试检查 OpenGL 错误。在每个 OpenGL 函数之后调用 glGetError()。此外,您还必须设置正确的绘图视口。在绘制到 FBO 之前调用 glViewport(0, 0, 512, 512)。在绘制到屏幕之前调用 glViewport(0, 0, display_width, display_height)。

此外,当您使用 FBO 渲染时,无需绑定 rttFrameTex。仅当您在着色器中读取纹理时才需要绑定纹理。

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

OpenGL 通过 FBO 渲染到纹理 -- 不正确的显示与正常纹理 的相关文章

  • 使用顶点缓冲区对象 (VBO) 渲染 Kinect 点云

    我正在尝试制作一个动态点云可视化工具 使用 Kinect 传感器每帧更新这些点 为了抓取帧 我使用 OpenCV 和 GLUT 来显示 OpenCV API 对于点 xyz 位置返回 640 x 480 float 对于 rgb 颜色数据返
  • OpenGL 与 OpenCL,选择哪个以及为什么?

    哪些功能使 OpenCL 能够独特地选择 OpenGL 和 GLSL 进行计算 尽管有与图形相关的术语和不实用的数据类型 OpenGL 是否有任何真正的警告 例如 可以通过使用其他纹理将 a 渲染到纹理来完成并行函数评估 减少操作可以通过迭
  • Go SQL查询不一致

    我在执行查询时遇到一些非常奇怪的不一致 并且想知道是否有人知道原因 想象一下我有一个定义如下的结构 type Result struct Afield string db A Bfield interface db B Cfield str
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • 共享来自单独命令/进程的属性

    我提供带有多个命令和子命令的命令行工具 我使用cobra https github com spf13 cobra命令行 我有两个单独的命令首先是前提条件e 给其他人 例如第一个命令是通过创建临时文件夹并验证某些文件来首选环境 第二个命令应
  • nVidia 和 ATI 之间的 OpenGL 渲染差异

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

    是否有一个完整的 WebP 编码器和解码器与当前每周 或可分叉 兼容 它的速度与标准 png 相当吗 这个人在 GitHub 上有一个包 其中包含 WebP 的编码器和解码器 https github com chai2010 webp h
  • 无法通过键获取 Gorilla 会话值

    我无法通过这种方式从会话中获取价值 它是nil session initSession r valWithOutType session Values key 完整代码 package main import fmt github com
  • 按引用或按值扫描功能

    我有以下代码 statement SELECT id from source where mgmt 1 var exists string errUnique dr db QueryRow statement mgmt Scan exist
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9
  • 如何在C#中执行Go函数

    有没有办法从 C 执行 Go 函数 例如 对于 Python 我会使用 Ironpython 我知道我可以生成一个进程来执行 Go 脚本 但如果可能的话 我真的不想回退到这样的解决方案 Google 搜索没有显示任何内容 那么有什么方法可以
  • 新显卡上的 nvoglv32.dll 中的绘制调用崩溃

    几天前 由于一些硬件更改 我设置了计算机并安装了新的 Windows 8 副本 其中 我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660 再次设置 Visual Studio 11 后 我从 Github 下载了
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • Go 的范围不能超过 (类型接口 {})

    我正处于尝试将我的注意力集中在 Go 上的婴儿阶段 目前 我正在模拟一个 API 请求 该请求返回包含对象数组的 JSON 格式的字符串 我试图找出迭代每个记录并访问每个字段的最合适的方法 最终 每个字段都将写入 Excel 电子表格 但现
  • sRGB 纹理。它是否正确?

    我最近阅读了一些有关 sRGB 格式以及它们如何允许硬件自动对典型显示器执行色彩校正的文章 作为我阅读的一部分 我发现您可以使用普通纹理和返回结果上的 pow 函数来模拟此步骤 无论如何 我想问两个问题 因为我以前从未使用过此功能 首先 有
  • (转)如何使用toml文件?

    正如标题 我想知道如何使用 golang 中的 toml 文件 在此之前 我展示了我的 toml 示例 这样对吗 datatitle enable true userids 12345 67890 datatitle 12345 prop1
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • Facebook 在分享我自己的页面时未检测到视频

    我有一个包含许多视频页面的网站 每页只有一个视频 当我在 Facebook 上分享其中一个页面的链接时 它不被视为视频 而只是一篇标准文章 缩略图 标题和描述都显示良好 但我希望 Facebook 显示视频 而不是显示缩略图 我在用着vid
  • 如何从 xcode 显示 xcodebuild 命令行?

    我正在尝试从 xcodebuild 构建一个工作模拟器版本 编译可以工作 但通过 WaxSim 安装时 最终产品将无法在模拟器上运行 如果我通过 Xcode GUI 构建 那么最终产品安装时不会出现 WaxSim 的问题 我的问题是 我怎样
  • Qt 检测标题栏上的鼠标单击(Windows)

    event 或 mousePressEvent 函数适用于小部件内部 但我想在单击标题栏 菜单栏的上部 包含关闭按钮等 时捕获 我怎样才能做到这一点 您可以重写nativeEvent 然后获取鼠标位置与geometry 不包括窗口框架 和f
  • 组名称变量在天蓝色管道中可以是动态的吗?

    我在 azure 上有两个环境 它们之间的区别之一只是来自变量组的环境变量 是否可以为一个管道动态设置组名称 而不是设置两个可以映射自己的组变量的管道 这是我的构建管道的示例 trigger master develop jobs job
  • jquery 无法在 Rails 中运行

    我已经阅读了很多关于在 Rails 中使用 jquery 的页面 但似乎仍然无法让它工作 我有 jquery rails gem 并且安装了 我在 application js 文件中有 require 语句 这是我一直运行的测试页面
  • Commission Junction 直接链接

    有谁知道是否有办法通过跟踪直接链接到 Commission Junction 上的广告商 我们不想依赖提要中发送的链接 因为其中很多都是垃圾链接 我想要的是一个仅转到广告商主页并且仍然允许我们接收佣金的链接 就像是 如果它必须通过 CJ 的
  • 使用 ruby​​-gmail 读取 Gmail 邮件

    我正在寻找一个实例方法ruby gmailgem 可以让我阅读 身体 或者 subject Gmail 邮件的 查看文档后发现here http www rubydoc info gems ruby gmail 0 3 1 我什么也没找到
  • 单击链接后保持全屏 api 全屏显示

    我正在使用 HTML5 全屏 API 因此用户可以全屏查看我的网站 但是当用户单击链接 例如菜单项 时 用户会切换回正常浏览器模式 当用户单击某些链接时 如何使浏览器保持全屏 最好不必将整个网站转换为 AJAX 页面加载系统 如果不转换为
  • 选项卡背景颜色幻灯片过渡到下一个选项卡

    我正在尝试实现背景过渡 当您单击选项卡时 当前选项卡的背景会滑动到单击的选项卡 有人可以帮忙吗 before after box sizing border box radio wrap input position absolute op
  • Angular Date 过滤器在 Firefox 中不起作用

    我正在使用日期过滤器来格式化我的角度应用程序中的日期 在 Firefox 中 我得到的日期值为 未定义 NaN NaN NaN NaN NaN PM 在 Chrome 中 它的工作原理非常完美 2014 年 6 月 25 日 7 22 47
  • Javascript split 将字符串分成两部分,无论字符串中存在多少个吐出字符

    我想使用 split 函数将 Javascript 中的字符串拆分为两部分 例如我有字符串 str 123 345 678 910 如果我使用 javascripts split 它会将其分为 4 部分 但我需要它分为两部分 仅考虑它遇到的
  • InfoPath 2013 是否支持 Visual Studio 2013?

    我正在尝试为 InfoPath 2013 表单开发自定义代码 我安装了 Visual Studio 2013 Professional 但在尝试编辑代码时收到以下消息 The following external components ar
  • 具有多个 AND 条件的 DataTable 选择实现

    我正在使用一个包含大约 50 000 行的 DataTableDataTable Select从中检索行 这Select需要多个AND条件包括通配符匹配 我玩过并发现通过做同样的事情Select多步执行可以大大减少执行时间 但是改变一下执行
  • linux bash脚本获取用户输入并存储在数组中

    我想编写一个 bash 脚本来获取用户输入并将其存储在数组中 输入 1 4 6 9 11 17 22 我希望将其保存为数组 像这样读 read a arr Test read a arr lt lt lt 1 4 6 9 11 17 22
  • Facebook c# sdk 获取用户电子邮件

    我有一个使用 facebook 进行身份验证的网站 我想在用户注册时收集一些基本信息 包括他们的电子邮件地址 我的登录代码是标准的 public ActionResult Login string returnUrl var oAuthCl
  • Web 浏览器中 HTML5 和 CSS3 支持的最佳指南是什么?

    您知道有关 HTML5 和 CSS3 的有用资源吗 UPDATE 我 我想很多人 正在寻找实用信息 了解如何以及在多大程度上可以使用这些未完成的技术 我发现了一个非常有用的资源 http caniuse com http caniuse c
  • Swift 泛型函数中的位移位

    我正在尝试编写一个需要移位操作的通用函数 我的行为我不理解 这是一个演示该问题的简单函数 func testBytes
  • 什么是无头服务,它做什么/完成什么,以及它的一些合法用例是什么?

    我读过一些关于 Kubernetes 的书籍以及文档中有关无头服务的页面 https kubernetes io docs concepts services networking service headless services 但我仍
  • 如何触发 Hudson 的另一项工作作为预构建步骤?

    如何触发 Hudson 的另一项工作作为预构建步骤 有一个参数化触发器插件 https wiki jenkins ci org display JENKINS Parameterized Trigger Plugin 这会在 添加构建步骤
  • OpenGL 通过 FBO 渲染到纹理 -- 不正确的显示与正常纹理

    离屏渲染到纹理绑定的离屏帧缓冲区对象应该是微不足道的 但我遇到了一个问题 我无法理解 我的完整示例程序 目前仅限 2D 在这里 http pastebin com hSvXzhJT http pastebin com hSvXzhJT 请参