void Update(void) { gl.Viewport(size, size); fbo.Bind(Framebuffer::Target::Draw); Framebuffer::AttachColorTexture( Framebuffer::Target::Draw, 1, holder.CurrentHeightMap(), 0 ); Context::ColorBuffer draw_buffs[2] = { FramebufferColorAttachment::_0, FramebufferColorAttachment::_1 }; gl.DrawBuffers(draw_buffs); prog.Use(); prog.tex_1.Set(holder.TexUnit1()); prog.tex_2.Set(holder.TexUnit2()); prog.new_drop.Set(std::rand()%size, std::rand()%size); vao.Bind(); gl.DrawArrays(PrimitiveType::Points, 0, 1); holder.Swap(); }
void Update(double time) { gl.Viewport(size, size); fbo.Bind(Framebuffer::Target::Draw); Framebuffer::AttachColorTexture( Framebuffer::Target::Draw, 1, holder.CurrentHeightMap(), 0 ); Context::ColorBuffer draw_buffs[2] = { FramebufferColorAttachment::_0, FramebufferColorAttachment::_1 }; gl.DrawBuffers(draw_buffs); prog.Use(); prog.hmap_1.Set(holder.HMapUnit1()); prog.hmap_2.Set(holder.HMapUnit2()); prog.time.Set(time); screen.Use(); gl.Disable(Capability::DepthTest); screen.Draw(); gl.Enable(Capability::DepthTest); holder.Swap(); }
void GIDeferredRenderer::SetupGeometryBuffer(unsigned windowWidth, unsigned windowHeight) { using namespace oglplus; static Context gl; // initialize geometry buffer geometryBuffer.Bind(FramebufferTarget::Draw); // build textures -- normal gl.Bound(TextureTarget::_2D, bufferTextures[0]) .Image2D(0, PixelDataInternalFormat::RGBA16F, windowWidth, windowHeight, 0, PixelDataFormat::RGB, PixelDataType::Float, nullptr) .MinFilter(TextureMinFilter::Nearest) .MagFilter(TextureMagFilter::Nearest); geometryBuffer.AttachColorTexture(FramebufferTarget::Draw, 0, bufferTextures[0], 0); // build textures -- albedo gl.Bound(TextureTarget::_2D, bufferTextures[1]) .Image2D(0, PixelDataInternalFormat::RGB8, windowWidth, windowHeight, 0, PixelDataFormat::RGB, PixelDataType::UnsignedByte, nullptr) .MinFilter(TextureMinFilter::Nearest) .MagFilter(TextureMagFilter::Nearest); geometryBuffer.AttachColorTexture(FramebufferTarget::Draw, 1, bufferTextures[1], 0); // build textures -- specular color and shininess gl.Bound(TextureTarget::_2D, bufferTextures[2]) .Image2D(0, PixelDataInternalFormat::RGBA8, windowWidth, windowHeight, 0, PixelDataFormat::RGBA, PixelDataType::UnsignedByte, nullptr) .MinFilter(TextureMinFilter::Nearest) .MagFilter(TextureMagFilter::Nearest); geometryBuffer.AttachColorTexture(FramebufferTarget::Draw, 2, bufferTextures[2], 0); // emissivenes gl.Bound(TextureTarget::_2D, bufferTextures[3]) .Image2D(0, PixelDataInternalFormat::RGB8, windowWidth, windowHeight, 0, PixelDataFormat::RGB, PixelDataType::UnsignedByte, nullptr) .MinFilter(TextureMinFilter::Nearest) .MagFilter(TextureMagFilter::Nearest); geometryBuffer.AttachColorTexture(FramebufferTarget::Draw, 3, bufferTextures[3], 0); // attach depth texture for depth testing gl.Bound(TextureTarget::_2D, bufferTextures[4]) .Image2D(0, PixelDataInternalFormat::DepthComponent24, windowWidth, windowHeight, 0, PixelDataFormat::DepthComponent, PixelDataType::Float, nullptr) .MinFilter(TextureMinFilter::Nearest) .MagFilter(TextureMagFilter::Nearest); geometryBuffer.AttachTexture(FramebufferTarget::Draw, FramebufferAttachment::Depth, bufferTextures[4], 0); // color textures auto attachments = std::vector<Context::ColorBuffer> { FramebufferColorAttachment::_0 , FramebufferColorAttachment::_1, FramebufferColorAttachment::_2, FramebufferColorAttachment::_3 }; // set draw buffers gl.DrawBuffers(attachments); // check if success building frame buffer if (!Framebuffer::IsComplete(FramebufferTarget::Draw)) { auto status = Framebuffer::Status(FramebufferTarget::Draw); Framebuffer::HandleIncompleteError(FramebufferTarget::Draw, status); } Framebuffer::Bind(Framebuffer::Target::Draw, FramebufferName(0)); }