32 {
33
34 std::string cubemap_str = CSE::AssetMgr::LoadAssetFile(CSE::AssetsPath() + "Shader/PBR/IBL/cubemap.vert");
35 std::string etc_str = CSE::AssetMgr::LoadAssetFile(CSE::AssetsPath() + "Shader/PBR/IBL/equirectangular_to_cubemap.frag");
36 std::string irr_str = CSE::AssetMgr::LoadAssetFile(CSE::AssetsPath() + "Shader/PBR/IBL/irradiance_convolution.frag");
37 std::string pre_str = CSE::AssetMgr::LoadAssetFile(CSE::AssetsPath() + "Shader/PBR/IBL/prefilter.frag");
38
42
43
44
45 glDisable(GL_CULL_FACE);
46
47 glGenRenderbuffers(1, &m_captureRBO);
48 glBindRenderbuffer(GL_RENDERBUFFER, m_captureRBO);
49 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 512, 512);
50
51 glGenFramebuffers(1, &m_captureFBO);
52 glBindFramebuffer(GL_FRAMEBUFFER, m_captureFBO);
53 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
54 GL_RENDERBUFFER, m_captureRBO);
55
56
57
58 stbi_set_flip_vertically_on_load(true);
59 std::string hdr_path = CSE::AssetsPath() + "Texture/hdr/newport_loft.hdr";
60 m_hdrTexture = SResource::Create<STexture>(hdr_path);
61 stbi_set_flip_vertically_on_load(false);
62
63
64
65 m_envCubemap =
new STexture(STexture::TEX_CUBE);
66 m_envCubemap->SetName("envCubemap.textureCubeMap");
67 m_envCubemap->SetAbsoluteID("envCubemap.textureCubeMap");
68 std::string hash = "CSEENV0000000001";
69 m_envCubemap->SetHash(hash);
70 m_envCubemap->InitTextureMipmap(512, 512);
71
72
73
74
75 mat4 captureProjection = mat4::Perspective(90.0f, 1.0f, 0.1f, 10.0f);
77 {
78 mat4::LookAt(
vec3(0.0f, 0.0f, 0.0f),
vec3(1.0f, 0.0f, 0.0f),
vec3(0.0f, -1.0f, 0.0f)),
79 mat4::LookAt(
vec3(0.0f, 0.0f, 0.0f),
vec3(-1.0f, 0.0f, 0.0f),
vec3(0.0f, -1.0f, 0.0f)),
80 mat4::LookAt(
vec3(0.0f, 0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f),
vec3(0.0f, 0.0f, 1.0f)),
81 mat4::LookAt(
vec3(0.0f, 0.0f, 0.0f),
vec3(0.0f, -1.0f, 0.0f),
vec3(0.0f, 0.0f, -1.0f)),
82 mat4::LookAt(
vec3(0.0f, 0.0f, 0.0f),
vec3(0.0f, 0.0f, 1.0f),
vec3(0.0f, -1.0f, 0.0f)),
83 mat4::LookAt(
vec3(0.0f, 0.0f, 0.0f),
vec3(0.0f, 0.0f, -1.0f),
vec3(0.0f, -1.0f, 0.0f))
84 };
85
86
87
88 glUseProgram(m_equirectangularToCubemapShader->Program);
89 int hdrTextureLocation = m_equirectangularToCubemapShader->UniformLocation("EquirectangularMap")->id;
90 m_equirectangularToCubemapShader->SetUniformMat4("PROJECTION_MATRIX", captureProjection);
91
92 m_hdrTexture->Bind(hdrTextureLocation, 0);
93
94 if(m_cubeVAO <= 0) LoadCubeVAO();
95 glGetError();
96 glViewport(0, 0, 512, 512);
97 glBindFramebuffer(GL_FRAMEBUFFER, m_captureFBO);
98 std::cout << "[PBR] Generating Environment Cubemap...";
99 for (unsigned int i = 0; i < 6; ++i) {
100 m_equirectangularToCubemapShader->SetUniformMat4("VIEW_MATRIX", captureViews[i]);
101
102 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
103 m_envCubemap->GetTextureID(), 0);
104 glGetError();
105 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
106 RenderCubeVAO();
107
108
109 }
110 m_envCubemap->GenerateMipmap();
111
112 std::cout << " finished!\n";
113
114
115
116 m_irradianceMap =
new STexture(STexture::TEX_CUBE);
117 m_irradianceMap->SetName("irradiance.textureCubeMap");
118 m_irradianceMap->SetAbsoluteID("irradiance.textureCubeMap");
119 hash = "CSEENV0000000002";
120 m_irradianceMap->SetHash(hash);
121 m_irradianceMap->InitTexture(32, 32);
122
123 glBindFramebuffer(GL_FRAMEBUFFER, m_captureFBO);
124 glBindRenderbuffer(GL_RENDERBUFFER, m_captureRBO);
125 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 32, 32);
126
127
128
129 glUseProgram(m_irradianceShader->Program);
130 int envTextureLocation = m_irradianceShader->UniformLocation("EnvironmentMap")->id;
131 m_irradianceShader->SetUniformMat4("PROJECTION_MATRIX", captureProjection);
132 m_envCubemap->Bind(envTextureLocation, 0);
133
134 glViewport(0, 0, 32, 32);
135 glBindFramebuffer(GL_FRAMEBUFFER, m_captureFBO);
136 std::cout << "[PBR] Generating Irradiance Cubemap...";
137 for (unsigned int i = 0; i < 6; ++i) {
138 m_irradianceShader->SetUniformMat4("VIEW_MATRIX", captureViews[i]);
139
140 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
141 m_irradianceMap->GetTextureID(), 0);
142 glGetError();
143 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
144 RenderCubeVAO();
145 }
146
147 std::cout << " finished!\n";
148
149
150
151 m_prefilterMap =
new STexture(STexture::TEX_CUBE);
152 m_prefilterMap->SetName("prefilter.textureCubeMap");
153 m_prefilterMap->SetAbsoluteID("prefilter.textureCubeMap");
154 hash = "CSEENV0000000003";
155 m_prefilterMap->SetHash(hash);
156 m_prefilterMap->InitTextureMipmap(128, 128);
157
158
159 m_prefilterMap->GenerateMipmap();
160
161
162
163 glUseProgram(m_prefilterShader->Program);
164 envTextureLocation = m_prefilterShader->UniformLocation("EnvironmentMap")->id;
165 m_prefilterShader->SetUniformMat4("PROJECTION_MATRIX", captureProjection);
166 m_envCubemap->Bind(envTextureLocation, 0);
167
168
169 glBindFramebuffer(GL_FRAMEBUFFER, m_captureFBO);
170 unsigned int maxMipLevels = 5;
171
172 std::cout << "[PBR] Backing Prefiltering Textures...";
173 for (unsigned int mip = 0; mip < maxMipLevels; ++mip) {
174
175 unsigned int mipWidth = 128 * std::pow(0.5, mip);
176 unsigned int mipHeight = 128 * std::pow(0.5, mip);
177 glBindRenderbuffer(GL_RENDERBUFFER, m_captureRBO);
178 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, mipWidth, mipHeight);
179 glViewport(0, 0, mipWidth, mipHeight);
180
181 float roughness = (float) mip / (float) (maxMipLevels - 1);
182 m_prefilterShader->SetUniformFloat("FLOAT_ROUGHNESS", roughness);
183 for (unsigned int i = 0; i < 6; ++i) {
184 m_prefilterShader->SetUniformMat4("VIEW_MATRIX", captureViews[i]);
185 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
186 m_prefilterMap->GetTextureID(), mip);
187
188 glGetError();
189 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
190 RenderCubeVAO();
191
192
193 }
194 std::cout << "Level " << mip << "..";
195 }
196 std::cout << " finished!\n";
197}