2017-01-19 10 views
0

パストレースャをGLSLに移植しようとしていますが、これを行うために、バックバッファの代わりにフレームバッファとしてテクスチャを使用するシェーダサンプルプログラムを変更する必要があります。 SharpGLとRenderBuffers

この

これはセットアップコード

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

ある

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

あるしかし、私はから戻ってくるのピクセルを検査するとき彼らは黒ですGetTexImage。このテクスチャを別の転送シェーダでバインドすると、黒のままです。私は、レンダバッファーの設定コードに何か不足していると思われ、あなたが持っている提案を感謝します!

答えて

0

Renderbuffersは、texturesではありません。したがって、レンダーバッファ上でglGetTexImageを実行すると、おそらくOpenGLエラーが発生します。 glBindTextureのテクスチャとしてバインドしようとすると、おそらくOpenGLエラーが発生しています。

テクスチャにレンダリングする場合は、テクスチャにレンダリングする必要があります。 glGenTextures/glTexImage2D/glFramebufferTexture2Dのように。

また、EXT_framebuffer_objectの使用を中止してください。 「EXT」という接尾辞を必要としない、コアのFBO機能を使用する必要があります。あなたが実際に古くなったOpenGLバージョンを使用している場合を除きます。

+0

ありがとうございました。 FramebufferTexture2Dは私が後にしたものです。最後に、基本を立てて実行しました。 :) – Dom

関連する問題