使用帧缓冲区渲染为立方体贴图纹理

dppower

我正在尝试使用帧缓冲区来渲染到立方体贴图,但是出现“ FRAMEBUFFER_INCOMPLETE_ATTACHMENT”错误。我可以将代码与2D纹理配合使用,类型设置为FLOAT或UNSIGNED_BYTE。我设置纹理多维数据集参数或将其附加到此代码中的方式是否存在一些错误:

this.inscatterTexture_ = gl.createTexture();
gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.inscatterTexture_);

gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);       

for (let i = 0; i < 6; i++) {
    // Create framebuffer
    this.inscatterFrameBuffers_[i] = gl.createFramebuffer();
    gl.bindFramebuffer(gl.FRAMEBUFFER, this.inscatterFrameBuffers_[i]);

    // Create and attach depth buffer
    this.inscatterDepthBuffers_[i] = gl.createRenderbuffer();
    gl.bindRenderbuffer(gl.RENDERBUFFER, this.inscatterDepthBuffers_[i]);
    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, INSCATTER_RESOLUTION, INSCATTER_RESOLUTION);
    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.inscatterDepthBuffers_[i]);
    gl.bindRenderbuffer(gl.RENDERBUFFER, null);

    // Attach one face of cube map
    gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, gl.RGBA, INSCATTER_RESOLUTION, INSCATTER_RESOLUTION, 0, gl.RGBA, gl.FLOAT, null);
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, this.inscatterTexture_, 0);

    if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
      let status_code = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
      console.log("Inscatter frame buffer, " + i + ", is not complete: " + FramebufferStatus[status_code]);
    }

    this.CreateInscatterTexture(gl, i);
}
man

显然,您首先需要创建立方体贴图的所有面。

"use strict";

function log() {
  var pre = document.createElement("pre");
  pre.appendChild(document.createTextNode(Array.prototype.join.call(arguments, " ")));
  document.body.appendChild(pre);
}

function glEnumToString(gl, value) {
  for(var key in gl) {
    if (gl[key] === value) {
      return key;
    }
  }
  return "0x" + value.toString(16);
}

var INSCATTER_RESOLUTION = 64;

var gl = document.createElement("canvas").getContext("webgl");
var ext = gl.getExtension("OES_texture_float");
if (!ext) { log("need OES_texture_float"); }
ext = gl.getExtension("OES_texture_float_linear");
if (!ext) { log("need OES_texture_float_linear"); }
           
var o = {};
(function() {
  this.inscatterFrameBuffers_ = [];
  this.inscatterDepthBuffers_ = [];
  this.inscatterTexture_ = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.inscatterTexture_);

  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);       
  for (let i = 0; i < 6; i++) {
    gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, gl.RGBA, INSCATTER_RESOLUTION, INSCATTER_RESOLUTION, 0, gl.RGBA, gl.FLOAT, null);
  }

  for (let i = 0; i < 6; i++) {
    // Create framebuffer
    this.inscatterFrameBuffers_[i] = gl.createFramebuffer();
    gl.bindFramebuffer(gl.FRAMEBUFFER, this.inscatterFrameBuffers_[i]);

    // Create and attach depth buffer
    this.inscatterDepthBuffers_[i] = gl.createRenderbuffer();
    gl.bindRenderbuffer(gl.RENDERBUFFER, this.inscatterDepthBuffers_[i]);
    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, INSCATTER_RESOLUTION, INSCATTER_RESOLUTION);
    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.inscatterDepthBuffers_[i]);
    gl.bindRenderbuffer(gl.RENDERBUFFER, null);

    // Attach one face of cube map
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, this.inscatterTexture_, 0);

    if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
      let status_code = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
      log("Inscatter frame buffer, " + i + ", is not complete: " + glEnumToString(gl, status_code));
    } else {
      log("success");
    }

  }
}).call(o);

这种情况似乎是驱动程序错误。我知道,至少在过去,Nvidia要求纹理必须可渲染才能提供,FRAMEBUFFER_COMPLETE即使您可能尚未使用该纹理进行渲染。例如,如果您制作没有尖峰的纹理并且不设置其过滤,则它将失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用帧缓冲区渲染为立方体贴图纹理

来自分类Dev

将立方体贴图纹理附加到帧缓冲区对象(FBO)时为GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

来自分类Dev

使用立方体贴图时的OpenGL清除缓冲区

来自分类Dev

CUDA立方体贴图纹理

来自分类Dev

渲染动态立方体贴图(OpenGL)

来自分类Dev

OpenGL:立方体贴图纹理,无UV贴图

来自分类Dev

OpenGL黑色/空白立方体贴图纹理

来自分类Dev

无法同时使用立方体贴图和2D纹理

来自分类Dev

OpenGL-将立方体贴图的面渲染为四边形

来自分类Dev

OpenGL:渲染天空盒立方体贴图问题

来自分类Dev

是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

来自分类Dev

使用OpenGL ES在iPhone上渲染到立方体贴图

来自分类Dev

如何在OpenGL中使用立方体贴图数组使用阴影贴图渲染多个点光源?

来自分类Dev

使用移动相机翻转OpenGL立方体贴图反射

来自分类Dev

使用移动相机翻转OpenGL立方体贴图反射

来自分类Dev

使用现有的2D纹理和glTextureView初始化立方体贴图

来自分类Dev

使用现有的2D纹理和glTextureView初始化立方体贴图

来自分类Dev

无法渲染到帧缓冲区(纹理)

来自分类Dev

(阴影贴图)将深度缓冲区渲染为纹理并进行绘制以进行检查

来自分类Dev

Unity构建太大的立方体贴图

来自分类Dev

动态立方体贴图 - opengl

来自分类Dev

是否可以在立方体贴图中将视频文件添加为纹理面?

来自分类Dev

OpenGL ES 2.0 / 3.0中带有位图的立方体贴图纹理

来自分类Dev

无法使用lwjgl和顶点缓冲区渲染纹理

来自分类Dev

如何将Scenekit背景的内容设置为立方体贴图

来自分类Dev

使用立方体贴图(OpenGL / GLSL),点光源是否可能产生柔和阴影?

来自分类Dev

LibGDX 0.9.9-在环境中应用立方体贴图

来自分类Dev

选择立方体贴图正确面的快速方法?

来自分类Dev

材质中的Unity更改立方体贴图插槽

Related 相关文章

  1. 1

    使用帧缓冲区渲染为立方体贴图纹理

  2. 2

    将立方体贴图纹理附加到帧缓冲区对象(FBO)时为GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

  3. 3

    使用立方体贴图时的OpenGL清除缓冲区

  4. 4

    CUDA立方体贴图纹理

  5. 5

    渲染动态立方体贴图(OpenGL)

  6. 6

    OpenGL:立方体贴图纹理,无UV贴图

  7. 7

    OpenGL黑色/空白立方体贴图纹理

  8. 8

    无法同时使用立方体贴图和2D纹理

  9. 9

    OpenGL-将立方体贴图的面渲染为四边形

  10. 10

    OpenGL:渲染天空盒立方体贴图问题

  11. 11

    是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

  12. 12

    使用OpenGL ES在iPhone上渲染到立方体贴图

  13. 13

    如何在OpenGL中使用立方体贴图数组使用阴影贴图渲染多个点光源?

  14. 14

    使用移动相机翻转OpenGL立方体贴图反射

  15. 15

    使用移动相机翻转OpenGL立方体贴图反射

  16. 16

    使用现有的2D纹理和glTextureView初始化立方体贴图

  17. 17

    使用现有的2D纹理和glTextureView初始化立方体贴图

  18. 18

    无法渲染到帧缓冲区(纹理)

  19. 19

    (阴影贴图)将深度缓冲区渲染为纹理并进行绘制以进行检查

  20. 20

    Unity构建太大的立方体贴图

  21. 21

    动态立方体贴图 - opengl

  22. 22

    是否可以在立方体贴图中将视频文件添加为纹理面?

  23. 23

    OpenGL ES 2.0 / 3.0中带有位图的立方体贴图纹理

  24. 24

    无法使用lwjgl和顶点缓冲区渲染纹理

  25. 25

    如何将Scenekit背景的内容设置为立方体贴图

  26. 26

    使用立方体贴图(OpenGL / GLSL),点光源是否可能产生柔和阴影?

  27. 27

    LibGDX 0.9.9-在环境中应用立方体贴图

  28. 28

    选择立方体贴图正确面的快速方法?

  29. 29

    材质中的Unity更改立方体贴图插槽

热门标签

归档