4#include "SFrameBuffer.h"
6#include "../GLProgramHandle.h"
7#include "../../Manager/EngineCore.h"
8#include "RenderInterfaces.h"
13 m_resMgr = CORE->GetCore(
ResMgr);
16SGBuffer::~SGBuffer() =
default;
18void SGBuffer::GenerateGBuffer(
int width,
int height) {
19 if(m_geometryFrameBuffer !=
nullptr)
return;
25 m_geometryFrameBuffer->SetName(m_geometryFrameBuffer->GetName() +
" - GBuffer");
30 m_depthTexture = m_geometryFrameBuffer->
GenerateTexturebuffer(SFrameBuffer::DEPTH, GL_DEPTH_COMPONENT);
37void SGBuffer::AttachGeometryFrameBuffer()
const {
38 if(m_geometryFrameBuffer ==
nullptr)
return;
39 m_geometryFrameBuffer->AttachFrameBuffer();
42void SGBuffer::AttachGeometryFrameBuffer(
int target)
const {
43 if(m_geometryFrameBuffer ==
nullptr)
return;
45 m_geometryFrameBuffer->AttachFrameBuffer(target);
48void SGBuffer::ResizeGBuffer(
int width,
int height) {
50 GenerateGBuffer(width, height);
53void SGBuffer::ReleaseGBuffer() {
54 if(m_geometryFrameBuffer !=
nullptr) {
55 m_resMgr->Remove(m_geometryFrameBuffer);
56 m_geometryFrameBuffer =
nullptr;
61 if(lightPassHandle ==
nullptr || m_lightPassHandle !=
nullptr)
return;
63 m_lightPassHandle = lightPassHandle;
64 m_firstTextureId = m_lightPassHandle->UniformLocation(
"geo.normal.mr")->id;
65 m_secondTextureId = m_lightPassHandle->UniformLocation(
"geo.albedo.a")->id;
66 m_depthTextureId = m_lightPassHandle->UniformLocation(
"geo.depth")->id;
69void SGBuffer::AttachLightPass()
const {
70 glUseProgram(m_lightPassHandle->Program);
73void SGBuffer::AttachLightPassTexture(
int textureLayout)
const {
74 m_firstTexture->Bind(m_firstTextureId, textureLayout);
75 m_secondTexture->Bind(m_secondTextureId, textureLayout + 1);
76 m_depthTexture->Bind(m_depthTextureId, textureLayout + 2);
79void SGBuffer::RenderLightPass()
const {
80 ShaderUtil::BindAttributeToPlane();
83const std::vector<SIRender*>& SGBuffer::GetRendersLayer()
const {
84 return m_rendersLayer;
87void SGBuffer::PushBackToLayer(
SIRender* render) {
88 m_rendersLayer.push_back(render);
91void SGBuffer::RemoveToLayer(
SIRender* render) {
92 m_rendersLayer.erase(std::remove(m_rendersLayer.begin(), m_rendersLayer.end(), render), m_rendersLayer.end());
95int SGBuffer::GetWidth()
const {
99int SGBuffer::GetHeight()
const {
104 return m_lightPassHandle;
STexture * GenerateTexturebuffer(BufferType type, int channel, int level=0)
void RasterizeFramebuffer()
void GenerateFramebuffer(BufferDimension dimension, int width, int height)