我真的无法理解这个:
以前我无法让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) 除了使用多个帧缓冲对象,我还可以创建一个并通过在需要时切换它的目标纹理来获得相同的结果吗?
我一直render.SetTargetTexture()在我的程序的API中实现一个函数,从逻辑上讲,如果在幕后使用更多的帧缓冲区,它将无法工作.那时我必须完全暴露帧缓冲区.
在DirectX中,您可以拥有单独的渲染目标和深度缓冲区,因此您可以绑定渲染目标和深度缓冲区,执行一些渲染,移除深度缓冲区,然后使用旧的深度缓冲区作为纹理进行更多渲染.
你会如何在opengl中解决这个问题?根据我的理解,你有一个framebuffer对象,它包含颜色缓冲区和可选的深度缓冲区.我不认为我可以同时绑定几个帧缓冲对象,我是否必须在每次更改时重新创建帧缓冲对象(可能是帧的几次)?普通的opengl程序如何做到这一点?
我正在尝试设置帧缓冲区对象,但我收到错误.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) 我有一部带有 Android 4.2.2 的 root 手机。我想使用引导加载程序代码中使用的minuiAPI(源代码here)在屏幕上绘制内容。minui 比原生 OpenGL 简单得多,我不需要 OpenGL 公开的任何复杂功能。
问题是我不能直接向fb0设备写东西。FBIOPUT_VSCREENINFO不明原因失败。
如何直接fb0在 Android 上绘制,或者如何minui在引导加载程序模式之外使用?
徘徊,如果有人可以帮助我.我目前正在使用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?
谢谢大家!
glCheckFramebufferStatus返回0,之后没有从glGetError返回错误.假设这是一个驱动程序错误是否安全?我似乎无法在OpenGL的文档中找到有关如何处理这种情况的任何内容.
我正在使用nvidia专有驱动程序在Linux(Ubuntu 14.04)上使用SDL2编写游戏.
我正在尝试创建一个正方形并在其中间放置一个红色圆圈.正如你在简单的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) 我创建了一个离屏帧缓冲区,并为其添加了两个渲染目标.
每个渲染目标都有自己的混合模式.我设置它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);但它似乎是全局状态而不是帧缓冲状态.
我不知道帧缓冲存储有多少或哪些状态.特别是我想知道关于帧缓冲附件的这些状态:
帧缓冲存储这些状态中的任何一种吗?如果您想分享,我也想知道其他州.
我知道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)