标签: framebuffer

有没有办法在 Three.js 中处理帧缓冲区对象 (FBO)?

我正在学习在使用 Three.js 的同时使用纹理(又称为帧缓冲区对象 (FBO))来操作 GPU 中的位置值。我一直使用这个问题作为起点,以及@mrdoob和@zz85的这个例子,以及这个旧线程

然而,这些示例相当过时(示例使用 Three.js rev.55 与当前 rev.80),因此我需要对代码进行大量修改和返工。在深入探讨之前,我想停下来问问是否已经将任何处理 FBO 的方法写入 Three.js 代码库中,或者我是否忽略了某个地方的更新脚本。谢谢!

如果没有,我会尽我最大的努力,如果看起来普遍有用的话,也许会将结果发布在这里。

framebuffer three.js

2
推荐指数
1
解决办法
2671
查看次数

绘图时,OpenGL ES Framebuffer奇怪的镜像

我真的无法理解这个:

以前我无法让Framebuffers工作,但我现在已经开始了.然而,这种令人难以置信的奇怪镜像正在从帧缓冲器生成纹理,我不知道为什么.基本上,我将尝试使用GL_TRIANGLE_FAN在0,0处绘制纹理,并且纹理在右上角显示为正常(或多或少),但出现在左下角,镜像.如果我用相同的纹理填充我的大部分或全部视口区域,结果是一个丑陋的z-fighting重叠.

屏幕截图将更加正义.

原始图片:

原文http://img301.imageshack.us/img301/1518/testsprite.png

绘制80x80 at(0,0)

80x80 http://img407.imageshack.us/img407/8339/screenshot20100106at315.png

在(0,0)绘制100x180

100x180 http://img503.imageshack.us/img503/2584/screenshot20100106at316.png

在(0,0)绘制320x480

320x480 http://img85.imageshack.us/img85/9172/screenshot20100106at317.png

这是我的代码:

设置视图:

//Apply the 2D orthographic perspective.
glViewport(0,0,320,480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, 320, 480, 0, -10000.0f, 100.0f);

//Disable depth testing.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);

//Enable vertext and texture coordinate arrays.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glShadeModel(GL_SMOOTH);

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);   

glGetError(); // Clear error codes

sprite = [Sprite createSpriteFromImage:@"TestSprite.png"];
[sprite retain];

[self createTextureBuffer];
Run Code Online (Sandbox Code Playgroud)

创建纹理缓冲区.

- (void) createTextureBuffer
{
    // generate texture
    glGenTextures(1, &bufferTexture);
    glBindTexture(GL_TEXTURE_2D, bufferTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, …
Run Code Online (Sandbox Code Playgroud)

iphone fbo opengl-es framebuffer

1
推荐指数
1
解决办法
1950
查看次数

OpenGL:仅使用一个帧缓冲区并切换目标纹理

除了使用多个帧缓冲对象,我还可以创建一个并通过在需要时切换它的目标纹理来获得相同的结果吗?

  • 这在所有情况下都是一个坏主意吗?如果是,为什么?

我一直render.SetTargetTexture()在我的程序的API中实现一个函数,从逻辑上讲,如果在幕后使用更多的帧缓冲区,它将无法工作.那时我必须完全暴露帧缓冲区.

opengl fbo framebuffer

1
推荐指数
1
解决办法
596
查看次数

在OpenGL中分离帧缓冲区和深度缓冲区

在DirectX中,您可以拥有单独的渲染目标和深度缓冲区,因此您可以绑定渲染目标和深度缓冲区,执行一些渲染,移除深度缓冲区,然后使用旧的深度缓冲区作为纹理进行更多渲染.

你会如何在opengl中解决这个问题?根据我的理解,你有一个framebuffer对象,它包含颜色缓冲区和可选的深度缓冲区.我不认为我可以同时绑定几个帧缓冲对象,我是否必须在每次更改时重新创建帧缓冲对象(可能是帧的几次)?普通的opengl程序如何做到这一点?

opengl framebuffer depth-buffer

1
推荐指数
1
解决办法
1484
查看次数

glGenFramebuffers,glBindFramebuffer等未声明

我正在尝试设置帧缓冲区对象,但我收到错误.glGenFramebuffers总是未声明的,像glBindFramebuffer这样的其他类似的事情也是如此.

我认为问题与导入有关,但我不确定如何解决这个问题.glew有可能无法正确设置,但我还没有找到如何完全设置它的简单解释.

这是失败的代码.

myBuffer = 0;
glGenFramebuffers(1, &myBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, myBuffer); 


glGenTextures(1, &renderedTexture);

// Bind to new texture
glBindTexture(GL_TEXTURE_2D, renderedTexture);

// Blank image
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, 1024, 768, 0,GL_RGB, GL_UNSIGNED_BYTE, 0);


glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);


glGenRenderbuffers(1, &dBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, dBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1024, 768);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dBuffer);



// Set "renderedTexture" as colour attachement #0
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);

DrawBuffers[2] = {GL_COLOR_ATTACHMENT0};

    glDrawBuffers(1, DrawBuffers); // "1" is the size of DrawBuffers
    // Check framebuffer is ok
      if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
      return false; …
Run Code Online (Sandbox Code Playgroud)

opengl fbo framebuffer undeclared-identifier

1
推荐指数
1
解决办法
7064
查看次数

直接在 Android 上写入帧缓冲区

我有一部带有 Android 4.2.2 的 root 手机。我想使用引导加载程序代码中使用的minuiAPI(源代码here)在屏幕上绘制内容。minui 比原生 OpenGL 简单得多,我不需要 OpenGL 公开的任何复杂功能。

问题是我不能直接向fb0设备写东西。FBIOPUT_VSCREENINFO不明原因失败。

如何直接fb0在 Android 上绘制,或者如何minui在引导加载程序模式之外使用?

android ioctl framebuffer android-source

1
推荐指数
1
解决办法
7212
查看次数

webGL - 如何在帧缓冲区旁边设置模板缓冲区并使用它?

徘徊,如果有人可以帮助我.我目前正在使用webGL将我的内容渲染到帧缓冲区,以便它可以用作项目其他部分的纹理.这就像一个冠军.但是,我现在需要使用模板缓冲区,同时渲染到帧缓冲区,因为我正在使用它来进行掩码.我似乎无法弄清楚如何创建/附加模板缓冲区以使用我的帧缓冲区?到目前为止这是我的代码:

// next time to create a frame buffer and texture
this.frameBuffer = gl.createFramebuffer();
this.texture = gl.createTexture();

gl.bindTexture(gl.TEXTURE_2D,  this.texture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer );

gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer );
gl.framebufferTexture2D(gl.FRAMEBUFFER, 
                        gl.COLOR_ATTACHMENT0, 
                        gl.TEXTURE_2D, 
                        this.texture,0);
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如何创建然后使用模板缓冲区以及上面创建的frameBuffer?

谢谢大家!

javascript framebuffer stencil-buffer webgl

1
推荐指数
1
解决办法
2772
查看次数

glCheckFramebufferStatus返回0并且glGetError中没有错误

glCheckFramebufferStatus返回0,之后没有从glGetError返回错误.假设这是一个驱动程序错误是否安全?我似乎无法在OpenGL的文档中找到有关如何处理这种情况的任何内容.

我正在使用nvidia专有驱动程序在Linux(Ubuntu 14.04)上使用SDL2编写游戏.

c++ linux opengl sdl framebuffer

1
推荐指数
1
解决办法
2612
查看次数

纹理不适合方形 - OpenGL

我正在尝试创建一个正方形并在其中间放置一个红色圆圈.正如你在简单的vert I中看到的那样,我将map(-1,1)范围扩展到(0,1)范围:

coord = position.xy*0.5 + vec2(0.5,0.5);
Run Code Online (Sandbox Code Playgroud)

如果你看一下simple.frag,就有这一行:

if(abs(length(coord - vec2(0.5,0.5))) < 0.3)
Run Code Online (Sandbox Code Playgroud)

因此,我期待在广场中间的红色圆圈.然而,这发生了:

在此输入图像描述

圆心超过(0.5,0.5).如果我将该行更改为:

if(abs(length(coord - vec2(0.0,0.0))) < 0.3)
Run Code Online (Sandbox Code Playgroud)

输出是:

在此输入图像描述

正如预期的那样,圆圈的中心位于左下角.但是不应该是右上角(1,1)?圆圈也不是完美的圆圈.我错过了什么?

初始化:

Shader simpleShader("simple.vert", "simple.frag");
Shader quadShader("quad.vert", "quad.frag");


GLfloat inVertices[] = {   

    -1.0f, 1.0f, 0.0, 
    -1.0f, -1.0f, 0.0,
     1.0f, -1.0f, 0.0,

    -1.0f, 1.0f, 0.0,
    1.0f, -1.0f, 0.0,
    1.0f,  1.0f, 0.0 };


GLfloat quadVertices[] = {   

    -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
    -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
    1.0f, -1.0f, 0.0f, 1.0f, 0.0f,

    -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, -1.0f, 0.0f, 1.0f, …
Run Code Online (Sandbox Code Playgroud)

opengl shader framebuffer glsl render-to-texture

1
推荐指数
1
解决办法
375
查看次数

帧缓冲存储哪些状态?

我创建了一个离屏帧缓冲区,并为其添加了两个渲染目标.

每个渲染目标都有自己的混合模式.我设置它glBlendFunci:

glBlendFunci(accum->buffId,     GL_ONE,  GL_ONE);
glBlendFunci(revealage->buffId, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
Run Code Online (Sandbox Code Playgroud)

framebuffer是否存储此混合模式?因为它特定于缓冲区.我应该在每一帧或仅在初始化代码中设置它吗?

屏幕外的帧缓冲也不会写入深度,所以我禁用了它,glDepthMask(GL_FALSE);但它似乎是全局状态而不是帧缓冲状态.

我不知道帧缓冲存储有多少或哪些状态.特别是我想知道关于帧缓冲附件的这些状态:

  1. glBlendFunci
  2. glBlendFunc
  3. glEnable(GL_BLEND)
  4. glEnable(GL_DEPTH_TEST)
  5. glDepthMask

帧缓冲存储这些状态中的任何一种吗?如果您想分享,我也想知道其他州.

我知道VAO对象存储了一些关于顶点属性的状态,所以我认为framebuffer也可能存储一些与其附件有关的状态

编辑:我更新了glBlendFunci参数以使用绘制索引,我使用了bufferId/objectId

glBlendFunci(accum->drawIndex,     GL_ONE,  GL_ONE);
glBlendFunci(revealage->drawIndex, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
Run Code Online (Sandbox Code Playgroud)

opengl framebuffer

1
推荐指数
1
解决办法
121
查看次数