Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl SharpGL和RenderBuffers_Opengl_Glsl_Sharpgl - Fatal编程技术网

Opengl SharpGL和RenderBuffers

Opengl SharpGL和RenderBuffers,opengl,glsl,sharpgl,Opengl,Glsl,Sharpgl,我正在尝试将pathtracer移植到GLSL,为此,我需要修改着色器示例程序,以使用纹理作为帧缓冲区,而不是backbuffer 这是顶点片段 #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

我正在尝试将pathtracer移植到GLSL,为此,我需要修改着色器示例程序,以使用纹理作为帧缓冲区,而不是backbuffer

这是顶点片段

#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);
}
这是运行时代码

//  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);
但是当我检查从GetEximage返回的像素时,它们是黑色的。当我在另一个transfer着色器中绑定此纹理时,它们将保持黑色。我怀疑我在renderbuffer的设置代码中遗漏了什么,如果您有任何建议,我将不胜感激

不是。因此,当您在renderbuffer上执行
glGetTexImage
时,可能会出现OpenGL错误。当您尝试使用
glBindTexture
将其绑定为纹理时,可能会遇到OpenGL错误

如果要渲染到纹理,则应渲染到纹理。如
glGenTextures/glTexImage2D/glFramebufferTexture2D
中所示


另外,请停止使用EXT\u framebuffer\u对象。您应该使用核心FBO功能,它不需要“EXT”后缀。除非您使用的是非常古老的OpenGL版本。

谢谢。FramebufferTexture2D就是我想要的。终于有了基础知识并开始运行。:)
//  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);