Add glTF PBR model loading
[opengl.git] / main.cpp
index 8fbff622b06ec1440851b33cdd69aeda1f46d0b8..16466005327c8ceef3d1afd2d6ecd9ddb367fa6b 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -5,6 +5,7 @@
 #include <vector>
 #ifdef __APPLE__
 #include <GL/glew.h>
+#include "cocoa.h"
 #else
 #include <OpenGL/glew.h>
 #endif
@@ -145,30 +146,38 @@ void display() {
        glUniform3fv(glGetUniformLocation(pbrProg->progId, "lightPositions"), 4, glm::value_ptr(lightPositions[0]));
        glUniform3fv(glGetUniformLocation(pbrProg->progId, "lightColors"), 4, glm::value_ptr(lightColors[0]));
 
-       glUniform1i(glGetUniformLocation(pbrProg->progId, "albedoMap"), 0);
-       glActiveTexture(GL_TEXTURE0);
-       glBindTexture(GL_TEXTURE_2D, albedoMap);
+       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "albedoMap"), 0); */
+       /* glActiveTexture(GL_TEXTURE0); */
+       /* glBindTexture(GL_TEXTURE_2D, albedoMap); */
 
-       glUniform1i(glGetUniformLocation(pbrProg->progId, "normalMap"), 1);
-       glActiveTexture(GL_TEXTURE1);
-       glBindTexture(GL_TEXTURE_2D, normalMap);
+       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "normalMap"), 1); */
+       /* glActiveTexture(GL_TEXTURE1); */
+       /* glBindTexture(GL_TEXTURE_2D, normalMap); */
 
-       glUniform1i(glGetUniformLocation(pbrProg->progId, "metallicMap"), 2);
-       glActiveTexture(GL_TEXTURE2);
-       glBindTexture(GL_TEXTURE_2D, metallicMap);
+       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "metallicMap"), 2); */
+       /* glActiveTexture(GL_TEXTURE2); */
+       /* glBindTexture(GL_TEXTURE_2D, metallicMap); */
 
-       glUniform1i(glGetUniformLocation(pbrProg->progId, "roughnessMap"), 3);
-       glActiveTexture(GL_TEXTURE3);
-       glBindTexture(GL_TEXTURE_2D, roughnessMap);
+       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "roughnessMap"), 3); */
+       /* glActiveTexture(GL_TEXTURE3); */
+       /* glBindTexture(GL_TEXTURE_2D, roughnessMap); */
        
-       glUniform1i(glGetUniformLocation(pbrProg->progId, "aoMap"), 4);
-       glActiveTexture(GL_TEXTURE4);
-       glBindTexture(GL_TEXTURE_2D, aoMap);
+       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "aoMap"), 4); */
+       /* glActiveTexture(GL_TEXTURE4); */
+       /* glBindTexture(GL_TEXTURE_2D, aoMap); */
 
        glUniform1i(glGetUniformLocation(pbrProg->progId, "irradianceMap"), 5);
        glActiveTexture(GL_TEXTURE5);
        glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->getIrradianceMap());
 
+       glUniform1i(glGetUniformLocation(pbrProg->progId, "prefilterMap"), 6);
+       glActiveTexture(GL_TEXTURE6);
+       glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->getPrefilterMap());
+
+       glUniform1i(glGetUniformLocation(pbrProg->progId, "brdfMap"), 7);
+       glActiveTexture(GL_TEXTURE7);
+       glBindTexture(GL_TEXTURE_2D, skybox->getBRDFMap());
+
        pbr->draw();
 
        for (Light &light: lights) drawLight(light);
@@ -218,16 +227,18 @@ void init() {
 
        pbrProg = new Program("pbrvert.glsl", "pbrfrag.glsl");
        glUseProgram(pbrProg->progId);
-       pbr = new Model("models/sphere.dae", *pbrProg, *skybox);
+       pbr = new Model("models/sphereMetal.gltf", *pbrProg, *skybox);
 
-       albedoMap = loadTexture("models/darktiles/darktiles1_basecolor.png");
-       metallicMap = loadTexture("models/darktiles/darktiles1_metallic.png");
-       normalMap = loadTexture("models/darktiles/darktiles1_normal.png");
-       roughnessMap = loadTexture("models/darktiles/darktiles1_roughness.png");
-       aoMap = loadTexture("models/darktiles/darktiles1_AO.png");
+       /* albedoMap = loadTexture("models/materials/streakedmetal/streakedmetal-albedo.png"); */
+       /* metallicMap = loadTexture("models/materials/streakedmetal/streakedmetal-metalness.png"); */
+       /* normalMap = loadTexture("models/materials/streakedmetal/streakedmetal-normal.png"); */
+       /* roughnessMap = loadTexture("models/materials/streakedmetal/streakedmetal-roughness.png"); */
+       /* aoMap = loadTexture("models/materials/streakedmetal/streakedmetal-ao.png"); */
 
        glEnable(GL_DEPTH_TEST); 
        glEnable(GL_CULL_FACE); 
+       // prevent edge artifacts in specular cubemaps
+       glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
 }
 
 bool* keyStates = new bool[256];
@@ -315,13 +326,15 @@ int main(int argc, char** argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGB|GLUT_3_2_CORE_PROFILE);
        glutInitWindowSize(WIDTH, HEIGHT);
-       int win = glutCreateWindow("Hello Triangle");
+       int win = glutCreateWindow("Physically Based Rendering");
        glutDisplayFunc(display);
 
        glewInit();
        
        init();
        
+       swizzle();
+
        glutKeyboardFunc(keyboard);
        glutKeyboardUpFunc(keyboardUp);
        glutTimerFunc(16, timer, 0);