在WebGL2中使用drawBuffers时遇到一些问题

2024-01-05

我想将延迟渲染器和前向渲染器组合在一起。为了共享相同的深度缓冲区,我使用具有 4 个颜色附件的单个帧缓冲区对象,COLOR_ATTACHMENT0-2 用于 G 缓冲区渲染,COLOR_ATTACHMENT3 用于延迟着色和正向渲染,以下是伪代码:

//**Gbufffer part**
Bind G-Buffer FBO
gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2]);
draw the G buffer

//**Lighting part**
Bind Lighting buffer FBO

//**Shading part**
Bind G-Buffer FBO
gl.drawBuffers([gl.COLOR_ATTACHMENT3]);

//**Forward rendring part**
//Still use the G-Buffer FBO and COLOR_ATTACHMENT3
draw forward material

使用这个的时候,我在firefox中遇到了一个错误:

错误:WebGL:drawBuffers:buffers[i]必须是 NONE 或 COLOR_ATTACHMENTi。

在 Chrome 中启动时,我得到了这个:

FrameBufferObject.ts:151 WebGL:INVALID_OPERATION:drawBuffers:COLOR_ATTACHMENTi_EXT 或 NONE

我的代码有什么问题吗?这真的让我很困惑……谢谢。


如果我没记错的话,您必须对第一个缓冲区使用颜色附件 0,对第二个缓冲区使用颜色附件 1,对第三个缓冲区使用颜色附件 2 等等。

换句话说,这是可以的

gl.drawBuffers([
  gl.COLOR_ATTACHMENT0,  // color attachment 0 to draw buffer 0
  gl.COLOR_ATTACHMENT1,  // color attachment 1 to draw buffer 1
  gl.COLOR_ATTACHMENT2,  // color attachment 2 to draw buffer 2
]);

这也可以

gl.drawBuffers([
  gl.COLOR_ATTACHMENT0,  // color attachment 0 to draw buffer 0
  gl.NONE,               // NONE to draw buffer 1
  gl.COLOR_ATTACHMENT2,  // color attachment 2 to draw buffer 2
]);

这不是!!

gl.drawBuffers([
  gl.COLOR_ATTACHMENT0,  // color attachment 0 to draw buffer 0
  gl.COLOR_ATTACHMENT2,  // color attachment 2 to draw buffer 1 ERROR!
  gl.COLOR_ATTACHMENT1,  // color attachment 1 to draw buffer 2 ERROR!
]);

所以就你的情况而言。

gl.drawBuffers([
   gl.COLOR_ATTACHMENT3,  // color attachment 3 to draw buffer 0 ERROR!
]);

必须始终匹配 0 到 0、1 到 1、2 到 2 等。

如果这确实是你正在做的事情,你应该创建 3 个帧缓冲区对象。一个包含前 3 个缓冲区,一个包含第四个缓冲区,一个包含所有 4 个缓冲区。然后你会做类似的事情

gl.bindFramebuffer(gl.FRAMEBUFFER, threeAttachmentFB);
gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2]);

.. draw stuff ..

gl.bindFramebuffer(gl.FRAMEBUFFER, oneAttachmentFB);
gl.drawBuffers([gl.COLOR_ATTACHMENT0]);

.. draw stuff ..

gl.bindFramebuffer(gl.FRAMEBUFFER, fourAttachmentFB);
gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1,
                gl.COLOR_ATTACHMENT2, gl.COLOR_ATTACHMENT3]);

.. draw stuff ..

除此之外,不保证各种组合都能发挥作用。目前尚不清楚 WebGL2 中的限制是什么,但在 WebGL1 中只有这些组合才能保证工作

  • 一种颜色附件(有或没有深度或深度模板)

    COLOR_ATTACHMENT0_WEBGL = RGBA/UNSIGNED_BYTE
    
  • 两种颜色附件(有或没有深度或深度模板)

    COLOR_ATTACHMENT0_WEBGL = RGBA/UNSIGNED_BYTE
    COLOR_ATTACHMENT1_WEBGL = RGBA/UNSIGNED_BYTE
    
  • 三种颜色附件(有或没有深度或深度模板)

    COLOR_ATTACHMENT0_WEBGL = RGBA/UNSIGNED_BYTE
    COLOR_ATTACHMENT1_WEBGL = RGBA/UNSIGNED_BYTE
    COLOR_ATTACHMENT2_WEBGL = RGBA/UNSIGNED_BYTE
    
  • 四种颜色附件(有或没有深度或深度模板)

    COLOR_ATTACHMENT0_WEBGL = RGBA/UNSIGNED_BYTE
    COLOR_ATTACHMENT1_WEBGL = RGBA/UNSIGNED_BYTE
    COLOR_ATTACHMENT2_WEBGL = RGBA/UNSIGNED_BYTE
    COLOR_ATTACHMENT3_WEBGL = RGBA/UNSIGNED_BYTE
    

所有其他组合可能会或可能不会工作,具体取决于 GPU/驱动程序/浏览器/操作系统

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

在WebGL2中使用drawBuffers时遇到一些问题 的相关文章

  • Android 中的 OpenGL 缩小

    我正在使用 3D 对象并渲染它并通过扩展 GLSurfaceView 实现渲染器来显示它 问题是如何通过捏合和捏合进行缩小 下面是我的班级 package com example objLoader import java nio Byte
  • 在没有 SurfaceView 的 Android 上获取 GPU 信息

    在Android上 有没有一种方法可以在不创建SurfaceView的情况下获取GPU信息 我不想使用 OpenGL 绘制任何内容 但我只需要获取硬件信息 例如供应商 OpenGL ES 版本 可用扩展等 抱歉 我不知道如何在 Androi
  • 如何获取特定 GLSurfaceView 的 EGL 显示/上下文

    这是后续我原来的问题 https stackoverflow com questions 6509588 egl vs gles 2 0 on android e g java 这可能太宽泛 而这个可能太具体 但也许我可以应用牛顿法 我的具
  • Android OpenGL ES 支持无处不在?

    我需要了解如果我选择在 OpenGL 而不是 android graphics 中的 android 原生 2D 图形 API 进行绘图 我会损失多少潜在安装量 android 文档似乎暗示 OpenGL ES API 基本上在所有手机上都
  • ios 8 opengl es 1.1 已停产?

    我们即将在 iOS 应用商店上推出一款游戏 最近我们发现它无法在 iOS 8 上运行 游戏加载到黑屏 但其他一切似乎都可以运行 可以听到音乐 对触摸屏有反应 但显示屏上没有任何反应 我们的引擎相当旧并且使用 OpenGL ES 1 1 我现
  • 为什么单个 Vec4 乘法会大大减慢我的 ogl es 2 片段着色器的速度?

    我正在为 iOS 设备编写 2D OpenGL 游戏 现在 我正在研究 iPad 第一代 上的性能 该游戏有 ogl 1 1 和 2 0 的代码路径 我可以通过 define 使用 ogl 2 0 时 分析器告诉我 我的渲染器利用率 相当稳
  • 如何通过ndk将android相机帧加载到opengl es纹理中?

    我最近一直在研究opengl es并尝试在android平台上访问相机 我需要做的就是通过ndk逐帧加载相机数据 然后加载到GL纹理中进行进一步处理 有什么帮助或建议吗 如果有示例代码 将不胜感激 谢谢你 将相机输出发送到 SurfaceT
  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 丢弃对 OpenGL 中的程序性能有影响吗?

    我正在读书this http code google com p gdc2011 android opengl wiki TalkTranscript文章 作者写道 以下是如何通过两个简单的步骤在每个平台上编写高性能应用程序 遵循最佳实践
  • GPU-android opengl es 3.0中的亮度直方图计算

    用于亮度直方图计算 我使用了 Brad Larson 的 GPU image ios 项目中的代码 他使用混合进行直方图计算 连接顶点和片段着色器 顶点着色器 version 300 es in vec4 position out vec3
  • 使用 OpenGL ES 绘制地球仪

    我正在尝试渲染一个地球仪 上面有地图的球体 OpenGL ES 1 1 on iOS 我能够绘制球体并绘制边界 但有一个问题 在我看来 不面向前方的线条也被绘制在屏幕上 像这样 在图片中 您可以看到美国渲染得很好 但您可以看到澳大利亚渲染在
  • GLConsumer 已附加到新 SurfaceTexture 的上下文

    Is SurfaceTexture附于GLContext手动创建时默认吗 如果是这样 怎么办 这是一个例子 我正在尝试创建自己的SurfaceTexture并将其设置为TextureView public class MainActivit
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • GLSurfaceView onDrawFrame 清除行为

    我在使用 GLSurfaceView 时遇到了不同的行为 据我所知 程序有责任清除每帧的缓冲区 颜色和深度 这意味着 如果我不清除缓冲区 我将获得最后一帧的内容 或双缓冲的前一帧 似乎无论在某些设备上如何 缓冲区都会被清除 我在一些测试设备
  • 在 iOS 上的 OpenGL ES 2.0 中创建 16 位亮度纹理

    我的文件中有 16 位数据 我正在尝试将其加载到 iOS 上的 OpenGL 亮度纹理中 如果我手动将 16 位值重新调整为 8 位 我可以按如下方式加载和显示数据 glTexImage2D GL TEXTURE 2D 0 GL LUMIN
  • 改进OpenGL粒子系统

    我正在寻找一种提高粒子系统性能的方法 因为它在 FPS 方面的成本非常高 这是因为我打电话 glDrawElements GL TRIANGLE STRIP mNumberOfIndices GL UNSIGNED SHORT 0 我为应用
  • 在 vanilla wegl 中向变换立方体添加定向光

    如何在 webGL 中向变换立方体添加方向光 我知道它需要法线 我已将它们添加到代码片段中 我已将它们注释掉 它还需要在顶点着色器中进行一些数学运算 不幸的是 当我取消注释时 此代码不起作用 attribute vec4 coords un
  • Android 模拟器支持 OpenGL ES 2.0 吗?

    本文http cobworks ca 2010 04 19 why android market has no games http cobworks ca 2010 04 19 why android market has no game
  • 如何创建多停止渐变片段着色器?

    我正在尝试创建一个 OpenGL ES 2 0 片段着色器 它沿一个轴输出多个停止渐变 它应该在以百分比定义的点处的多种颜色之间进行插值 我已经通过使用实现了这一点if是片段着色器 如下所示 float y gl FragCoord y f
  • 何时调用 glMatrixMode()

    我所关注的大多数 Android OpenGL ES 教程都有其 onSurfaceChanged 函数 如下所示 public void onSurfaceChanged GL10 gl int width int height gl g

随机推荐