2017-01-19 83 views
0

我試圖將一個pathtracer移植到GLSL,並且爲此我需要修改着色器示例程序以使用紋理作爲幀緩衝而不是後臺緩衝。SharpGL和RenderBuffer

這是頂點片段

#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); 
} 

這是設置代碼

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]); 

這是運行時代碼

// 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它們是黑色的。當我在另一個轉移着色器中綁定這個紋理時,它們仍然是黑色的。我懷疑我在渲染緩衝區的設置代碼中缺少一些東西,並希望您有任何建議!

回答

0

Renderbuffers不是textures。所以當你在渲染緩衝區上做glGetTexImage時,你可能會遇到OpenGL錯誤。當你試圖用glBindTexture作爲紋理來綁定它時,你可能會遇到OpenGL錯誤。

如果要渲染到紋理,應渲染到紋理。如glGenTextures/glTexImage2D/glFramebufferTexture2D

此外,請停止使用EXT_framebuffer_object。您應該使用核心FBO功能,該功能不需要「EXT」後綴。除非你使用的是非常古老的OpenGL版本。

+0

謝謝你。 FramebufferTexture2D是我所追求的。最後得到了基礎知識並運行。 :) – Dom

相關問題