1#include "SdfRenderGroup.h"
2#include "../../OGLDef.h"
3#include "../../Util/Render/STexture.h"
4#include "../../Util/GLProgramHandle.h"
5#include "../../Util/Render/SFrameBuffer.h"
6#include "../../Util/Render/ShaderUtil.h"
7#include "../../Component/CameraComponent.h"
8#include "../LightMgr.h"
9#include "../EngineCore.h"
15 m_nodeSize =
vec3{ 10, 4, 4 };
19 m_sdfMapBuffer->SetName(
"SDF Render Group Texture");
20 float wh = m_nodeSize.x * m_nodeSize.y * m_nodeSize.z;
21 float wh_sqrt = sqrtf(wh);
22 m_cellSize =
vec2{ ceilf(wh_sqrt), floorf(wh_sqrt) };
23 m_mapSize =
vec2{ m_envSize * m_cellSize.x, m_envSize * m_cellSize.y };
25 m_sdfMapBuffer->GenerateFramebuffer(SFrameBuffer::PLANE, m_mapSize.x, m_mapSize.y);
27 m_mapTexture = m_sdfMapBuffer->GenerateTexturebuffer(SFrameBuffer::RENDER, GL_RGBA);
28 m_sdfMapBuffer->GenerateRenderbuffer(SFrameBuffer::DEPTH, GL_DEPTH_COMPONENT);
29 m_sdfMapBuffer->RasterizeFramebuffer();
31 m_mapTexture->SetAbsoluteID(
"sdfmap.textureFakeCubeMap");
32 std::string hash =
"CSEENV0000000005";
33 m_mapTexture->SetHash(hash);
34 m_mapTexture->GenerateMipmap();
37 m_testTexture = SResource::Create<STexture>(
"File:test.png");
38 m_testTexture->GenerateMipmap();
39 m_sdfHandle = SResource::Create<GLProgramHandle>(
"File:Shader/SDF/sdfmap.post");
41 const auto& e = m_sdfHandle->UniformLocation(
"sdf.tex");
42 if (e !=
nullptr) m_testTextureId = m_sdfHandle->UniformLocation(
"sdf.tex")->id;
46 m_lightMgr = CORE->GetCore(
LightMgr);
49SdfRenderGroup::~SdfRenderGroup() =
default;
51void SdfRenderGroup::RegisterObject(
SIRender*
object) {
54void SdfRenderGroup::RemoveObjects(
SIRender*
object) {
57#include "../../Util/CaptureDef.h"
58#include "../../Util/AssetsDef.h"
60void SdfRenderGroup::RenderAll(
const CameraBase& camera)
const {
61 const auto& uniforms = m_sdfHandle->Uniforms;
62 const auto& cameraStruct = camera.GetCameraMatrixStruct();
64 m_sdfMapBuffer->AttachFrameBuffer();
66 glViewport(0, 0, (
int)m_mapSize.x, (
int)m_mapSize.y);
67 glUseProgram(m_sdfHandle->Program);
68 m_testTexture->Bind(m_testTextureId, 0);
70 glDisable(GL_CULL_FACE);
72 cameraStruct.projection, mat4::Identity());
73 glUniform2fv(uniforms.SourceBufferSize, 1, m_mapSize.Pointer());
74 BindShaderUniforms(*m_sdfHandle);
76 ShaderUtil::BindAttributeToPlane();
84void SdfRenderGroup::Exterminate() {
87void SdfRenderGroup::BindShaderUniforms(
const GLProgramHandle& handle)
const {
88 const auto& uniforms = handle.Uniforms;
90 if(uniforms.SdfEnvSize != HANDLE_NULL)
91 glUniform1i(uniforms.SdfEnvSize, m_envSize);
92 if(uniforms.SdfCellSize != HANDLE_NULL)
93 glUniform2fv(uniforms.SdfCellSize, 1, m_cellSize.Pointer());
94 if(uniforms.SdfNodeSize != HANDLE_NULL)
95 glUniform3fv(uniforms.SdfNodeSize, 1, m_nodeSize.Pointer());
96 if(uniforms.SdfNodeSpace != HANDLE_NULL)
97 glUniform1f(uniforms.SdfNodeSpace, m_nodeSpace);
98 if(uniforms.SdfFrameCount != HANDLE_NULL)
99 glUniform1i(uniforms.SdfFrameCount, m_frameCount);
102int SdfRenderGroup::BindShaderMap(
const GLProgramHandle& handle,
int textureLayout)
const {
104 if(handle.Uniforms.SdfMap != HANDLE_NULL) {
105 m_mapTexture->Bind(handle.Uniforms.SdfMap, textureLayout);
int AttachLightToShader(const GLProgramHandle *handle) const
Class for managing rendering operations.
static void BindCameraToShader(const GLProgramHandle &handle, const mat4 &camera, const vec3 &cameraPosition, const mat4 &projection, const mat4 &transform)
Binds the camera data to the shader.