首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SharpGL和RenderBuffers

SharpGL和RenderBuffers
EN

Stack Overflow用户
提问于 2017-01-19 00:51:25
回答 1查看 682关注 0票数 0

我试图将路径跟踪器移植到GLSL,为此,我需要修改一个着色器示例程序,以使用纹理作为框架缓冲区而不是后台缓冲区。

这是顶点片段

代码语言:javascript
复制
#version 130

out vec2 texCoord;

// https://rauwendaal.net/2014/06/14/rendering-a-screen-covering-triangle-in-opengl/
void main()
{
 float x = -1.0 + float((gl_VertexID & 1) << 2);
 float y = -1.0 + float((gl_VertexID & 2) << 1);
 texCoord.x = x;
 texCoord.y = y;
 gl_Position = vec4(x, y, 0, 1);
}

这是安装代码

代码语言:javascript
复制
gl.GenFramebuffersEXT(2, _FrameBuffer);
gl.BindFramebufferEXT(OpenGL.GL_FRAMEBUFFER_EXT, _FrameBuffer[0]);

gl.GenRenderbuffersEXT(2, _RaytracerBuffer);
gl.BindRenderbufferEXT(OpenGL.GL_RENDERBUFFER_EXT, _RaytracerBuffer[0]);
gl.RenderbufferStorageEXT(OpenGL.GL_RENDERBUFFER_EXT, OpenGL.GL_RGBA32F, (int)viewport[2], (int)viewport[3]);

这是运行时代码

代码语言:javascript
复制
//  Get a reference to the raytracer shader.
var shader = shaderRayMarch;

// setup first framebuffer (RGB32F)
gl.BindFramebufferEXT(OpenGL.GL_FRAMEBUFFER_EXT, _FrameBuffer[0]);
gl.Viewport((int)viewport[0], (int)viewport[1], (int)viewport[2], (int)viewport[3]); //0,0,width,height)
gl.FramebufferRenderbufferEXT(OpenGL.GL_FRAMEBUFFER_EXT, OpenGL.GL_COLOR_ATTACHMENT0_EXT, OpenGL.GL_RENDERBUFFER_EXT, _RaytracerBuffer[0]);
gl.FramebufferRenderbufferEXT(OpenGL.GL_FRAMEBUFFER_EXT, OpenGL.GL_DEPTH_ATTACHMENT_EXT, OpenGL.GL_RENDERBUFFER_EXT, 0);
uint [] DrawBuffers = new uint[1];
DrawBuffers[0] = OpenGL.GL_COLOR_ATTACHMENT0_EXT;
gl.DrawBuffers(1, DrawBuffers);

shader.Bind(gl);
shader.SetUniform1(gl, "screenWidth", viewport[2]);
shader.SetUniform1(gl, "screenHeight", viewport[3]);
shader.SetUniform1(gl, "fov", 40.0f);
gl.DrawArrays(OpenGL.GL_TRIANGLES, 0, 3);
shader.Unbind(gl);

int[] pixels = new int[(int)viewport[2]*(int)viewport[3]*4];
gl.GetTexImage(_RaytracerBuffer[0], 0, OpenGL.GL_RGBA32F, OpenGL.GL_INT, pixels);

但是当我检查从GetTexImage返回的像素时,它们是黑色的。当我把这个纹理绑定在一个进一步的转移着色,他们仍然是黑色的。我怀疑我在渲染缓冲区的设置代码中遗漏了一些东西,希望您能给出任何建议!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-19 01:01:17

Renderbuffers不是https://www.khronos.org/opengl/wiki/Texture。因此,当您在呈现缓冲区上执行glGetTexImage时,可能会出现OpenGL错误。当您试图将其绑定为glBindTexture纹理时,可能会出现OpenGL错误。

如果要呈现为纹理,则应呈现为纹理。就像在glGenTextures/glTexImage2D/glFramebufferTexture2D一样。

另外,请停止使用EXT_framebuffer_object。您应该使用核心FBO功能,它不需要"EXT“后缀。除非您使用的是非常古老的OpenGL版本,否则不会。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41731996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档