/** * Window has changed size, or has just been created. In either case, we need to use the window * dimensions to set the viewport and the projection matrix. */ void ChangeSize(int w, int h) { glViewport(0, 0, w, h); transformPipeline.setMatrixStacks(modelViewMatrix, projectionMatrix); modelViewMatrix.identity(); screenWidth = w; screenHeight = h; GenerateOrtho2DMat(w, h, hdrTexturesWidth[curHDRTex], hdrTexturesHeight[curHDRTex]); }
/////////////////////////////////////////////////////////////////////////////// // This is called at least once and before any rendering occurs. If the screen // is a resizeable window, then this will also get called whenever the window // is resized. void ChangeSize(int nWidth, int nHeight) { glViewport(0, 0, nWidth, nHeight); transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix); modelViewMatrix.LoadIdentity(); // update screen sizes screenWidth = nWidth; screenHeight = nHeight; GenerateOrtho2DMat(nWidth, nHeight, hdrTexturesWidth[curHDRTex], hdrTexturesHeight[curHDRTex]); }
/////////////////////////////////////////////////////////////////////////////// // This is called at least once and before any rendering occurs. If the screen // is a resizeable window, then this will also get called whenever the window // is resized. void ChangeSize(int nWidth, int nHeight) { glViewport(0, 0, nWidth, nHeight); transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix); viewFrustum.SetPerspective(35.0f, float(nWidth)/float(nHeight), 1.0f, 100.0f); projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix()); modelViewMatrix.LoadIdentity(); // update screen sizes screenWidth = nWidth; screenHeight = nHeight; glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, hdrTextures[0]); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGB16F, screenWidth, screenHeight, GL_FALSE); GenerateOrtho2DMat(nWidth, nHeight); glUseProgram(0); }
/** * Window has changed size, or has just been created. In either case, we need to use the window * dimensions to set the viewport and the projection matrix. */ void ChangeSize(int w, int h) { glViewport(0, 0, w, h); transformPipeline.setMatrixStacks(modelViewMatrix, projectionMatrix); viewFrustum.setPerspective(35.0f, float(w) / float(h), 1.0f, 100.0f); projectionMatrix.setMatrix(viewFrustum.GetProjectionMatrix()); modelViewMatrix.identity(); GenerateOrtho2DMat(w, h); screenWidth = w; screenHeight = h; // resize texture glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depthTextureName); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_DEPTH_COMPONENT24, w, h, GL_FALSE); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msTexture[0]); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGBA8, w, h, GL_FALSE); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC(void) { GLfloat texCoordOffsets[4][5*5*2]; GLfloat exposureLUT[20] = { 11.0, 6.0, 3.2, 2.8, 2.2, 1.90, 1.80, 1.80, 1.70, 1.70, 1.60, 1.60, 1.50, 1.50, 1.40, 1.40, 1.30, 1.20, 1.10, 1.00 }; // Make sure OpenGL entry points are set GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } // Will not use depth buffer glDisable(GL_DEPTH_TEST); curHDRTex = 0; // Init codel-view and leave it modelViewMatrix.LoadIdentity(); // Black glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Setup LUT texture for use with the adaptive exposure filter glGenTextures(1, lutTxtures); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_1D, lutTxtures[1]); glTexImage1D(GL_TEXTURE_1D, 0, GL_R16F, 20, 0, GL_RED, GL_FLOAT, exposureLUT); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Setup HDR texture(s) glActiveTexture(GL_TEXTURE0); glGenTextures(1, hdrTextures); glBindTexture(GL_TEXTURE_2D, hdrTextures[curHDRTex]); // Load HDR image from EXR file LoadOpenEXRImage("Tree.exr", hdrTextures[curHDRTex], hdrTexturesWidth[curHDRTex], hdrTexturesHeight[curHDRTex]); // Create ortho matrix and screen-sized quad matching images aspect ratio GenerateOrtho2DMat(screenWidth, screenHeight, hdrTexturesWidth[curHDRTex], hdrTexturesHeight[curHDRTex]); //GenerateFBOOrtho2DMat(hdrTexturesWidth[curHDRTex], hdrTexturesHeight[curHDRTex]); gltGenerateOrtho2DMat(hdrTexturesWidth[curHDRTex], hdrTexturesHeight[curHDRTex], fboOrthoMatrix, fboQuad); // Setup tex coords to be used for fetching HDR kernel data for (int k = 0; k < 4; k++) { float xInc = 1.0f / (GLfloat)(hdrTexturesWidth[curHDRTex] >> k); float yInc = 1.0f / (GLfloat)(hdrTexturesHeight[curHDRTex] >> k); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { texCoordOffsets[k][(((i*5)+j)*2)+0] = (-1.0f * xInc) + ((GLfloat)i * xInc); texCoordOffsets[k][(((i*5)+j)*2)+1] = (-1.0f * yInc) + ((GLfloat)j * yInc); } } } // Load shaders mapTexProg = gltLoadShaderPairWithAttributes("hdr.vs", "hdr_simple.fs", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(mapTexProg, 0, "oColor"); glLinkProgram(mapTexProg); varExposureProg = gltLoadShaderPairWithAttributes("hdr.vs", "hdr_exposure_image.fs", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(varExposureProg, 0, "oColor"); glLinkProgram(varExposureProg); glUseProgram(varExposureProg); glUniform1i(glGetUniformLocation(varExposureProg, "textureUnit0"), 0); adaptiveProg = gltLoadShaderPairWithAttributes("hdr.vs", "hdr_adaptive.fs", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(adaptiveProg, 0, "oColor"); glLinkProgram(adaptiveProg); glUseProgram(adaptiveProg); glUniform1i(glGetUniformLocation(adaptiveProg, "textureUnit0"), 0); glUniform1i(glGetUniformLocation(adaptiveProg, "textureUnit1"), 1); glUniform2fv(glGetUniformLocation(adaptiveProg, "tc_offset"), 25, texCoordOffsets[0]); glUseProgram(0); // Create and bind an FBO glGenFramebuffers(1,&fboName); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboName); // Create the FBO texture glGenTextures(1, fboTextures); glBindTexture(GL_TEXTURE_2D, fboTextures[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, hdrTexturesWidth[curHDRTex], hdrTexturesHeight[curHDRTex], 0, GL_RGBA, GL_FLOAT, NULL); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTextures[0], 0); // Make sure all went well gltCheckErrors(); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Set first running mode curProg = adaptiveProg; }