31 image.tex.format = GL_RGB;
32 image.tex.internalFormat = GL_RGB32F;
33 image.tex.type = GL_FLOAT;
34 image.tex.maxFilter = GL_LINEAR;
35 image.tex.minFilter = GL_LINEAR_MIPMAP_LINEAR;
44 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
45 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
46 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
47 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
48 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
49 for (
unsigned int i = 0; i < 6; ++i) {
51 GL_RGB, GL_FLOAT,
nullptr);
55 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
56 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
57 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
58 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
59 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
61 for (
unsigned int i = 0; i < 6; ++i) {
63 GL_RGB, GL_FLOAT,
nullptr);
65 glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
70 brdfLut.internalFormat = GL_RG16F;
74 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
75 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
82 uboParams.create(GL_UNIFORM_BUFFER, GL_STATIC_DRAW);
86 ENVMAP_VERT,
sizeof(ENVMAP_VERT),
87 ENVMAP_FRAG,
sizeof(ENVMAP_FRAG));
191 image.tex.genMipmap();
196 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo);
198 glGetIntegerv(GL_VIEWPORT, vp);
200 const glm::mat4 proj = glm::perspective(glm::radians(90.0f), 1.0f, 0.1f, 10.0f);
202 const glm::mat4 views[] =
204 proj * glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)),
205 proj * glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)),
206 proj * glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f)),
207 proj * glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f)),
208 proj * glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(0.0f, -1.0f, 0.0f)),
209 proj * glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(0.0f, -1.0f, 0.0f))
215 image.tex.bind(GL_TEXTURE1);
216 const GLuint mvpLoc = glGetUniformLocation(
prog->id,
"mvp");
220 prog->setInt(
"mode", 1);
222 for (
int i = 0; i < 6; i++) {
223 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
225 glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, &views[i][0][0]);
229 prog->setInt(
"mode", 2);
231 const int maxMipLevels = 5;
232 for (
int mip = 0; mip < maxMipLevels; mip++) {
233 float roughness = float(mip) / float(maxMipLevels - 1);
235 prog->setFloat(
"roughness", roughness);
236 glViewport(0, 0, size, size);
237 for (
int i = 0; i < 6; i++) {
238 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
240 glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, &views[i][0][0]);
246 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
247 glViewport(vp[0], vp[1], vp[2], vp[3]);