ios 中纹理的多重采样渲染

2024-03-13

我正在尝试在启用多重采样的 ios 中渲染到纹理,然后在最终输出中使用该纹理。这可能吗?

到目前为止,我只得到了黑色纹理或锯齿图像。我正在使用的代码是:

  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

  glGenFramebuffers(1, &framebuffer);
  glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

  glGenRenderbuffers(1, &colorRenderbuffer);
  glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
  //glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, width, height);
  glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA4, width, height);
  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

  glGenRenderbuffers(1, &depthRenderbuffer);
  glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
  //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, self.view.bounds.size.height);
  glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, width, height);
  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

  GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
  if(status != GL_FRAMEBUFFER_COMPLETE) {
    NSLog(@"failed to make complete framebuffer object %x", status);
  }

  // Render my scene

  glBindFramebuffer( GL_FRAMEBUFFER, framebuffer );
  glViewport(0,0,width,height);
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

  // Draw scene

  // Then bind default framebuffer

  glBindFramebuffer( GL_FRAMEBUFFER, 1 );

  // Draw other things

  // Now resolve the multisampling and draw texture

  glResolveMultisampleFramebufferAPPLE();

  glUseTexture( GL_TEXTURE_2D, texture );

  // Draw with texture

这段代码不起作用。如果我对深度渲染缓冲区进行多重采样,它会失败。如果我只使用普通的 fbo 作为深度,那么它可以工作,但会产生锯齿图像。

有人知道我哪里出错了吗?

Thanks!


是的!我发现我做错了什么。我错误地认为我可以拥有以下内容:

帧缓冲区

  • 附加到纹理的多重采样颜色渲染缓冲区

  • 多重采样深度缓冲区

但你不能这样做。 D:您必须具备以下条件:

多重采样帧缓冲区:

  • 多重采样颜色渲染缓冲区(未附加到纹理)

  • 多重采样深度渲染缓冲区

正常帧缓冲区:

  • 附加到纹理的颜色渲染缓冲区。这是 glResolveMultisampleFramebufferAPPLE() 将写入的内容以及我们将用来渲染结果的内容。

  • 无深度缓冲区。

IE。您必须将多重采样渲染的结果复制到全新的帧缓冲区。

一些代码:

  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

  glGenFramebuffers(1, &resolved_framebuffer);
  glBindFramebuffer(GL_FRAMEBUFFER, resolved_framebuffer);
  glGenRenderbuffers(1, &resolvedColorRenderbuffer);
  glBindRenderbuffer(GL_RENDERBUFFER, resolvedColorRenderbuffer);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

  glGenFramebuffers(1, &framebuffer);
  glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

  glGenRenderbuffers(1, &colorRenderbuffer);
  glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
  glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height);
  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);

  glGenRenderbuffers(1, &depthRenderbuffer);
  glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
  glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, width, height);
  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

  GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
  if(status != GL_FRAMEBUFFER_COMPLETE) {
    NSLog(@"failed to make complete framebuffer object %x", status);
  }

  // Render my scene

  glBindFramebuffer( GL_FRAMEBUFFER, framebuffer );
  glViewport(0,0,width,height);
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

  // Draw scene

  // Then bind default framebuffer

  glBindFramebuffer( GL_FRAMEBUFFER, 1 );

  // Draw other things

  // Now resolve the multisampling into the other fbo

  glBindFramebuffer( GL_READ_FRAMEBUFFER_APPLE, framebuffer );
  glBindFramebuffer( GL_DRAW_FRAMEBUFFER_APPLE, resolved_framebuffer );

  glResolveMultisampleFramebufferAPPLE();

  glBindTexture( GL_TEXTURE_2D, texture );

  // Draw with texture

谢谢戈兹,你让我找到了正确的方向!

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

ios 中纹理的多重采样渲染 的相关文章

随机推荐

  • FLAGS/EFLAGS 是破坏列表的“CC”(条件控制)的一部分吗?

    这是后续扩展汇编器中的 qm 是什么 https stackoverflow com questions 21516852 what is qm in extended assembler 使用时RDRAND 它设置 或取消设置 进位标志
  • 适用于 Windows 的 Python 服务存在一些问题

    我已经检查了至少几十个与我类似的案例 但仍然没有找到解决方案 我希望有人能提供一些线索 这里一定有我遗漏的东西 我正在使用Python3 6制作Windows服务 如果该服务未运行 则必须运行 exe文件 这是 py import win3
  • JAVA_HOME 和 PATH 已设置,但 java -version 仍显示旧版本

    我正在使用 Linux Mint Cinnamon 14 我已经设置了 JAVA HOME and PATH环境变量在 profile如下 export JAVA HOME home aqeel development jdk jdk1 6
  • 使用 Podman 连接到 VPN

    有了这个Dockerfile FROM fedora 30 ENV LANG C UTF 8 RUN dnf upgrade y dnf install y openssh clients openvpn slirp4netns dnf c
  • java 计算字符串中的空格数

    我写了一个程序 需要String作为用户输入并显示字母 数字和的数量white spaces 我使用以下代码编写了代码Tokenizer class 它计算字母和数字 但忽略了white spaces 有任何想法吗 import java
  • 如何找到贝塞尔曲线的中点?

    我想制作一条 命名 贝塞尔曲线 我希望它是一个单词命名的 这样我就不必担心自动换行 我通过P5制作贝塞尔曲线bezier sx sy c1x c1y c2x c2y ex ey 函数 我希望在贝塞尔曲线的中间显示一个字符串 但我不知道如何找
  • 获取双动画的当前值

    我有一个故事板 我正在其中使一个矩形向上移动 就像 MPH 汽车仪表中的针一样 所以 我让它从 0 到 60 我希望能够在它变化时获得它的当前值 这样我就可以使用该值来制作数字仪表 如何获取双动画从开始到结束的当前值 我有这样的事情 Dou
  • 如何获得两个集合的交集,同时不仅通过引用而且还通过它们的相同结构和条目识别相等的集合值/项目?

    我有两个交易两个Set实例 const set1 new Set name a name b lastname bb name c name d const set2 new Set name b name d 集合中的任何对象都将具有多个
  • 如何在 heroku 上启动 Python SimpleHTTPServer?

    我想在heroku 上启动Python HTTPServer 请注意 这不是 Python 框架 代码片段附在下面 我如何才能在 Heroku 上启动此服务器 我可以在本地计算机上运行该服务器 但我希望它部署在 Heroku 上 请提供见解
  • Web 应用程序作为服务自动更新,无需启动器

    如果应用程序是没有启动器的 Web 应用程序即服务 install4j 中的自动更新功能是否有效 我尝试了网络资源中提到的许多方法 但没有成功 请帮忙 我正在使用 install4j Windows 版本 6 1 6 编辑1 英戈 凯格尔
  • Bootstrap 4 - Scrollspy 不起作用

    我已经按照BS4中如何使用Scrollspy的文档进行操作 但它不起作用 那么我该如何解决它 我的身体有posistion relative 这是我的身体标签 这是导航栏的 HTML
  • 对 data.frame 或矩阵中的行求和

    我有一个非常大的数据框 其中行作为观察值 列作为遗传标记 我想创建一个新列 其中包含使用 R 的每个观察的选定列数的总和 如果我有 200 列和 100 行 那么我希望创建一个有 100 行的新列 其中包含第 43 至 167 列的总和 这
  • 异步套接字 - 处理错误的 socket.AcceptAsync 值

    Socket 类有一个方法 AcceptAsync 它返回 true 或 false 我原以为 false 返回值是一个错误条件 但在 Microsoft 为异步套接字提供的示例中 它们在检查失败后同步调用回调函数 如下所示 public
  • 如何制作一个钝角的按钮?

    如何制作一个钝角的按钮 我希望发生这样的事 我就这样来到这里 我的代码 Fiddle https jsfiddle net soledar10 nLt9qd5s box sizing border box btn display inlin
  • Android mkdirs() 不工作

    我正在开发我的第一个 Android 应用程序 在尝试创建目录来保存录制的视频文件时遇到了问题 我的主要活动有一个方法buttonOnClickRecord调用使用 android 相机的意图 我还在这个方法调用期间创建了一个文件 并且我正
  • 如何找出方法或函数的调用者是谁? [复制]

    这个问题在这里已经有答案了 我想编写一个调试函数或方法来帮助打印有用的信息 当它被调用时 我需要 调用对象的内存地址 如果由对象调用 调用者的方法签名 或方法的名称 或函数的名称 拥有该方法或函数的类名 是否可以在不传递一大堆参数的情况下获
  • 为什么我无法使用 Puppeteer 访问 hideFunction() 函数中的“窗口”?

    我有一个非常简单的傀儡师 https github com GoogleChrome puppeteer使用的脚本exposeFunction https github com GoogleChrome puppeteer blob mas
  • Swift 中数组的 endIndex 的正确行为是什么?

    endIndex 返回与 count 相同的值 这是正确的行为还是错误 var ar 1 2 3 4 ar count 4 ar endIndex 4 count是集合中的项目数 而endIndex is the Index 来自Colle
  • Android - 移动网络设置菜单(Jelly Bean)

    以下代码不适用于 Jelly Bean Android 4 1 final ComponentName cn new ComponentName com android phone com android phone Settings fi
  • ios 中纹理的多重采样渲染

    我正在尝试在启用多重采样的 ios 中渲染到纹理 然后在最终输出中使用该纹理 这可能吗 到目前为止 我只得到了黑色纹理或锯齿图像 我正在使用的代码是 glGenTextures 1 texture glBindTexture GL TEXT