/** * @fn void ScreenRepaint::initFrameBufferObjects(); * * @brief Initialises the frame buffer objects. If this is the first time this method is called, then the * shader programs are read in and the texture and pixel buffer object handles are created and stored. * Otherwise, if this is called as the result of a resize, a new ortho2D matrix is recalculated, and if * the canvas is larger than previous sizes, the pixel buffer size is re-allocated. * * @todo Fix bug that causes texture to draw incorrectly at large canvas sizes. * * @author Phil * @date 3/15/2012 */ void ScreenRepaint::initFrameBufferObjects(){ if(!fboInitialized){ // Create screen post process program //screenRenderProg = gltLoadShaderPairWithAttributes("/shaders/texpassthrough.vs", "/shaders/gaussianGlow.fs", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "texCoord0"); screenRenderProg = gltLoadShaderPairWithAttributes(vertexFileName, fragmentFileName, 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "texCoord0"); glBindFragDataLocation(screenRenderProg, 0, "oColor"); // bind the output of the shader to index zero - this is the same as using the default (depricated) gl_FragColor glLinkProgram(screenRenderProg); // relink, so that the graphics card knows what it's outputting to. screenWidthLoc = glGetUniformLocation(screenRenderProg, "screenWidth"); screenHeightLoc = glGetUniformLocation(screenRenderProg, "screenHeight"); // Create screen textures glActiveTexture(screenTextureID); // note that we are using GL_TEXTURE1, not the default glGenTextures(1, screenTextures); // Allocate a pixel buffer to initialize textures and PBOs pixelDataSize = CALC_SCREEN_PIXELS; // Setup texture unit // Initialize texture data glBindTexture(GL_TEXTURE_2D, screenTextures[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenWidth, screenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); // Alloc space for copying pixels so we dont call malloc on every draw glGenBuffers(1, pixBuffObjs); glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]); glBufferData(GL_PIXEL_PACK_BUFFER, pixelDataSize, NULL, GL_DYNAMIC_COPY); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); // Create geometry and a matrix for screen aligned drawing gltGenerateOrtho2DMat(screenWidth/2, screenHeight/2, orthoMatrix, screenQuad); // Make sure all went well gltCheckErrors(); fboInitialized = true; }else{ // reset screen aligned quad gltGenerateOrtho2DMat(screenWidth, screenHeight, orthoMatrix, screenQuad); GLuint val = CALC_SCREEN_PIXELS; if(pixelDataSize < val){ pixelDataSize = val; // Resize PBOs glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]); glBufferData(GL_PIXEL_PACK_BUFFER, pixelDataSize, NULL, GL_DYNAMIC_COPY); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); } gltCheckErrors(); } }
/////////////////////////////////////////////////////////////////////////////// // 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; // reset screen aligned quad gltGenerateOrtho2DMat(screenWidth, screenHeight, orthoMatrix, screenQuad); free(pixelData); pixelDataSize = screenWidth*screenHeight*3*sizeof(unsigned int); pixelData = (void*)malloc(pixelDataSize); // Resize PBOs #ifndef OPENGL_ES glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]); glBufferData(GL_PIXEL_PACK_BUFFER, pixelDataSize, pixelData, GL_DYNAMIC_COPY); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); #endif gltCheckErrors(); }
/////////////////////////////////////////////////////////////////////////////// // Enable and setup the GLSL program used for // flushes, etc. void UseProcessProgram(M3DVector4f vLightPos, M3DVector4f vColor, int textureUnit) { glUseProgram(processProg); // Set Matricies for Vertex Program glUniformMatrix4fv(glGetUniformLocation(processProg, "mvMatrix"), 1, GL_FALSE, transformPipeline.GetModelViewMatrix()); glUniformMatrix4fv(glGetUniformLocation(processProg, "pMatrix"), 1, GL_FALSE, transformPipeline.GetProjectionMatrix()); // Set the light position glUniform3fv(glGetUniformLocation(processProg, "vLightPos"), 1, vLightPos); // Set the vertex color for rendered pixels glUniform4fv(glGetUniformLocation(processProg, "vColor"), 1, vColor); // Set the texture unit for the texBO fetch glUniform1i(glGetUniformLocation(processProg, "lumCurveSampler"), 1); // If this geometry is textured, set the texture unit if(textureUnit != -1) { glUniform1i(glGetUniformLocation(processProg, "bUseTexture"), 1); glUniform1i(glGetUniformLocation(processProg, "textureUnit0"), textureUnit); } else { glUniform1i(glGetUniformLocation(processProg, "bUseTexture"), 0); } gltCheckErrors(processProg); }
void SetupOITResolveProg() { glUseProgram(oitResolve); // Set projection matrix glUniformMatrix4fv(glGetUniformLocation(oitResolve, "pMatrix"), 1, GL_FALSE, transformPipeline.GetProjectionMatrix()); // Set MVP matrix glUniformMatrix4fv(glGetUniformLocation(oitResolve, "mvMatrix"), 1, GL_FALSE, transformPipeline.GetModelViewMatrix()); // Now setup the right textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msTexture[0]); glUniform1i(glGetUniformLocation(oitResolve, "origImage"), 0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depthTextureName); glUniform1i(glGetUniformLocation(oitResolve, "origDepth"), 1); glUniform1f(glGetUniformLocation(oitResolve, "sampleCount"), 8); glActiveTexture(GL_TEXTURE0); gltCheckErrors(oitResolve); }
void Init() { //init glew GLenum err = glewInit(); if(err != GLEW_OK) fprintf(stderr,"error : %s\n",glewGetErrorString(err)); //init clear color glClearColor(0.0f,0.0f,0.0f,1.0f); //init shader manager shaderManager.InitializeStockShaders(); //init enable functions glEnable(GL_DEPTH_TEST); //init batches initTriangleBatch(); initFloorBatch(); initMirrorBatch(&mirrorFrontBatch); //bind floor texture glGenTextures(1,textures); glBindTexture(GL_TEXTURE_2D,textures[0]); LoadBMPTexture("Marble.bmp",GL_LINEAR_MIPMAP_LINEAR,GL_LINEAR,GL_REPEAT); //create and bind a FBO glGenFramebuffers(1,&fboName); glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fboName); //create depth renderbuffer glGenRenderbuffers(1,&depthBufferName); glBindRenderbuffer(GL_RENDERBUFFER,depthBufferName); glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT32,mirrorWidth,mirrorHeight); //create reflection texture for mirror glGenTextures(1,&mirrorTexture); glBindTexture(GL_TEXTURE_2D,mirrorTexture); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,mirrorWidth,mirrorHeight,0,GL_RGBA,GL_FLOAT,NULL); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,mirrorTexture,0); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,depthBufferName); gltCheckErrors(); glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0); }
void SetupFlatColorProg(GLfloat *vLightPos, GLfloat *vColor) { glUseProgram(flatColorProg); // Set projection matrix glUniformMatrix4fv(glGetUniformLocation(flatColorProg, "pMatrix"), 1, GL_FALSE, transformPipeline.GetProjectionMatrix()); // Set MVP matrix glUniformMatrix4fv(glGetUniformLocation(flatColorProg, "mvMatrix"), 1, GL_FALSE, transformPipeline.GetModelViewMatrix()); // Set Light Pos glUniform3fv(glGetUniformLocation(flatColorProg, "vLightPos"), 1, vLightPos); // Set Color glUniform4fv(glGetUniformLocation(flatColorProg, "vColor"), 1, vColor); gltCheckErrors(flatColorProg); }
void SetupHDRProg() { glUseProgram(hdrResolve); // Set projection matrix glUniformMatrix4fv(glGetUniformLocation(hdrResolve, "pMatrix"), 1, GL_FALSE, transformPipeline.GetProjectionMatrix()); // Set MVP matrix glUniformMatrix4fv(glGetUniformLocation(hdrResolve, "mvMatrix"), 1, GL_FALSE, transformPipeline.GetModelViewMatrix()); // Set user controled uniforms glUniform1fv(glGetUniformLocation(hdrResolve, "exposure"), 1, &exposure); // Set texture uniforms glUniform1i(glGetUniformLocation(hdrResolve, "origImage"), 0); glUniform1i(glGetUniformLocation(hdrResolve, "sampleWeightSampler"), 1); // Setup MS sepcific uniforms glUniform1i(glGetUniformLocation(hdrResolve, "sampleCount"), sampleCount); glUniform1i(glGetUniformLocation(hdrResolve, "useWeightedResolve"), useWeightedResolve); // Now setup the right textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, hdrTextures[0]); // Check if sample weight buffer needs to be updated if (sampleCount != lastSampleCount) { glBindBuffer(GL_TEXTURE_BUFFER_ARB, sampleWeightBuf); void *data = glMapBufferRange(GL_TEXTURE_BUFFER_ARB, 0, sizeof(float)*8, (GL_MAP_WRITE_BIT |GL_MAP_INVALIDATE_RANGE_BIT)); memcpy(data, (void*)sampleWeights[sampleCount],sizeof(float)*8); glUnmapBuffer(GL_TEXTURE_BUFFER_ARB); lastSampleCount = sampleCount; } gltCheckErrors(hdrResolve); }
void SetupTexReplaceProg(GLfloat *vLightPos, GLfloat *vColor) { glUseProgram(texReplaceProg); // Set projection matrix glUniformMatrix4fv(glGetUniformLocation(texReplaceProg, "pMatrix"), 1, GL_FALSE, transformPipeline.GetProjectionMatrix()); // Set MVP matrix glUniformMatrix4fv(glGetUniformLocation(texReplaceProg, "mvMatrix"), 1, GL_FALSE, transformPipeline.GetModelViewMatrix()); // Set Light Pos glUniform3fv(glGetUniformLocation(texReplaceProg, "vLightPos"), 1, vLightPos); // Set Color glUniform4fv(glGetUniformLocation(texReplaceProg, "vColor"), 1, vColor); // Set Tex Unit glUniform1i(glGetUniformLocation(texReplaceProg, "textureUnit0"), 0); gltCheckErrors(texReplaceProg); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC(void) { #ifndef ANGLE GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } #endif // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); // Black glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gltMakeTorus(torusBatch, 0.4f, 0.15f, 35, 35); GLfloat alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); glGenTextures(1, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Create blur program blurProg = gltLoadShaderPairWithAttributes("blur.vs", "blur.fs", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "texCoord0"); // Create blur textures glGenTextures(6, blurTextures); // XXX I don't think this is necessary. Should set texture data to NULL // Allocate a pixel buffer to initialize textures and PBOs pixelDataSize = screenWidth*screenHeight*3*sizeof(unsigned int); // XXX This should be unsigned byte void* data = (void*)malloc(pixelDataSize); memset(data, 0x00, pixelDataSize); // Setup 6 texture units for blur effect // Initialize texture data for (int i=0; i<6;i++) { glActiveTexture(GL_TEXTURE1+i); glBindTexture(GL_TEXTURE_2D, blurTextures[i]); #ifndef OPENGL_ES glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); #else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #endif glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenWidth, screenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, data); } // Alloc space for copying pixels so we dont call malloc on every draw #ifndef OPENGL_ES glGenBuffers(1, pixBuffObjs); glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]); glBufferData(GL_PIXEL_PACK_BUFFER, pixelDataSize, pixelData, GL_DYNAMIC_COPY); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); #endif // Create geometry and a matrix for screen aligned drawing gltGenerateOrtho2DMat(screenWidth, screenHeight, orthoMatrix, screenQuad); // Make sure all went well gltCheckErrors(); }
/////////////////////////////////////////////////////////////////////////////// // 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; }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC() { #ifndef ANGLE GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } #endif // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); // Black glClearColor(0.0f, 0.0f, 0.0f, 1.0f); #if defined __APPLE__ || defined ANGLE ninja.LoadFromSBM("ninja.sbm", GLT_ATTRIBUTE_VERTEX, GLT_ATTRIBUTE_NORMAL, GLT_ATTRIBUTE_TEXTURE0); #else ninja.LoadFromSBM("../../../Src/Models/Ninja/ninja.sbm", GLT_ATTRIBUTE_VERTEX, GLT_ATTRIBUTE_NORMAL, GLT_ATTRIBUTE_TEXTURE0); #endif gltMakeTorus(torusBatch, 0.4f, 0.15f, 35, 35); gltMakeSphere(sphereBatch, 0.1f, 26, 13); GLfloat alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); glGenTextures(1, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); glGenTextures(1, ninjaTex); glBindTexture(GL_TEXTURE_2D, ninjaTex[0]); #if defined __APPLE__ LoadBMPTexture("NinjaComp.bmp", GL_LINEAR, GL_LINEAR, GL_CLAMP); #elif defined ANGLE LoadBMPTexture("NinjaComp.bmp", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); #else LoadBMPTexture("../../../Src/Models/Ninja/NinjaComp.bmp", GL_LINEAR, GL_LINEAR, GL_CLAMP); #endif glGenFramebuffers(1,&fboName); // Create depth renderbuffer glGenRenderbuffers(1, &depthBufferName); glBindRenderbuffer(GL_RENDERBUFFER, depthBufferName); #ifndef ANGLE glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32, screenWidth, screenHeight); #else glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, screenWidth, screenHeight); #endif // Create 3 color renderbuffers glGenRenderbuffers(3, renderBufferNames); glBindRenderbuffer(GL_RENDERBUFFER, renderBufferNames[0]); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, screenWidth, screenHeight); glBindRenderbuffer(GL_RENDERBUFFER, renderBufferNames[1]); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, screenWidth, screenHeight); glBindRenderbuffer(GL_RENDERBUFFER, renderBufferNames[2]); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, screenWidth, screenHeight); // Attach all 4 renderbuffers to FBO glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboName); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBufferName); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBufferNames[0]); #ifndef OPENGL_ES glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, renderBufferNames[1]); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER, renderBufferNames[2]); #endif // See bind frag location in Chapter 9 processProg = gltLoadShaderPairWithAttributes("multibuffer.vs", "multibuffer_frag_location.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "texCoord0"); #ifndef OPENGL_ES glBindFragDataLocation(processProg, 0, "oStraightColor"); glBindFragDataLocation(processProg, 1, "oGreyscale"); glBindFragDataLocation(processProg, 2, "oLumAdjColor"); #endif glLinkProgram(processProg); #ifndef OPENGL_ES // Create 3 new buffer objects glGenBuffers(3,texBO); glGenTextures(1, &texBOTexture); int count = 0; float* fileData = 0; // Load first texBO with a tangent-like curve, 1024 values fileData = LoadFloatData("LumTan.data", &count); if (count > 0) { glBindBuffer(GL_TEXTURE_BUFFER_ARB, texBO[0]); glBufferData(GL_TEXTURE_BUFFER_ARB, sizeof(float)*count, fileData, GL_STATIC_DRAW); delete fileData; } // Load second texBO with a sine-like curve, 1024 values fileData = LoadFloatData("LumSin.data", &count); if (count > 0) { glBindBuffer(GL_TEXTURE_BUFFER_ARB, texBO[1]); glBufferData(GL_TEXTURE_BUFFER_ARB, sizeof(float)*count, fileData, GL_STATIC_DRAW); delete fileData; } // Load third texBO with a linear curve, 1024 values fileData = LoadFloatData("LumLinear.data", &count); if (count > 0) { glBindBuffer(GL_TEXTURE_BUFFER_ARB, texBO[2]); glBufferData(GL_TEXTURE_BUFFER_ARB, sizeof(float)*count, fileData, GL_STATIC_DRAW); delete fileData; } // Load the Tan ramp first glBindBuffer(GL_TEXTURE_BUFFER_ARB, 0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_BUFFER_ARB, texBOTexture); glTexBufferARB(GL_TEXTURE_BUFFER_ARB, GL_R32F, texBO[0]); #endif glActiveTexture(GL_TEXTURE0); // Reset framebuffer binding glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Make sure all went well gltCheckErrors(); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC(void) { GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); gltMakeCylinder(bckgrndCylBatch, 4.0, 4.0, 5.2, 1024, 1); gltMakeDisk(diskBatch, 0.0, 1.5, 40, 10); glass1Batch.Begin(GL_TRIANGLE_FAN, 4, 1); glass1Batch.Vertex3f(-1.0f, -1.0f, 0.0f); glass1Batch.Vertex3f( 1.0f, -1.0f, 0.0f); glass1Batch.Vertex3f( 1.0f, 1.0f, 0.0f); glass1Batch.Vertex3f(-1.0f, 1.0f, 0.0f); glass1Batch.End(); glass2Batch.Begin(GL_TRIANGLE_FAN, 4, 1); glass2Batch.Vertex3f( 0.0f, 1.0f, 0.0f); glass2Batch.Vertex3f( 1.0f, 0.0f, 0.0f); glass2Batch.Vertex3f( 0.0f, -1.0f, 0.0f); glass2Batch.Vertex3f(-1.0f, 0.0f, 0.0f); glass2Batch.End(); glass3Batch.Begin(GL_TRIANGLE_FAN, 3, 1); glass3Batch.Vertex3f( 0.0f, 1.0f, 0.0f); glass3Batch.Vertex3f( 1.0f, -1.0f, 0.0f); glass3Batch.Vertex3f(-1.0f, -1.0f, 0.0f); glass3Batch.End(); glass4Batch.Begin(GL_TRIANGLE_FAN, 4, 1); glass4Batch.Vertex3f(-1.0f, 1.0f, 0.0f); glass4Batch.Vertex3f( 1.0f, 0.5f, 0.0f); glass4Batch.Vertex3f( 1.0f, -1.0f, 0.0f); glass4Batch.Vertex3f(-1.0f, -0.5f, 0.0f); glass4Batch.End(); glGenTextures(2, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); glBindTexture(GL_TEXTURE_2D, textures[1]); LoadBMPTexture("start_line.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Create and bind an FBO glGenFramebuffers(1,&msFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msFBO); // Create depth texture glGenTextures(1, &depthTextureName); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depthTextureName); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_DEPTH_COMPONENT24, screenWidth, screenHeight, GL_FALSE); // Setup HDR render texture glGenTextures(1, msTexture); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msTexture[0]); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGBA8, screenWidth, screenHeight, GL_FALSE); // Create and bind an FBO glGenFramebuffers(1, &msFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msFBO); // Attach texture to first color attachment and the depth RBO glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msTexture[0], 0); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depthTextureName, 0); // Reset framebuffer binding glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Load oit resolve shader oitResolve = gltLoadShaderPairWithAttributes("basic.vs", "oitResolve.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(oitResolve, 0, "oColor"); glLinkProgram(oitResolve); // Load multisample resolve shader msResolve = gltLoadShaderPairWithAttributes("basic.vs", "msResolve.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(msResolve, 0, "oColor"); glLinkProgram(msResolve); // Make sure all went well gltCheckErrors(oitResolve); gltCheckErrors(msResolve); int numMasks = 0; glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &numMasks); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC() { GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); // Black glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gltMakeTorus(torusBatch, 0.4f, 0.15f, 35, 35); gltMakeSphere(sphereBatch, 0.1f, 26, 13); gltMakeCylinder(cylinderBatch,0.3f, 0.2f, 1.0, 10,10); GLfloat alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); mirrorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); mirrorBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); mirrorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); mirrorBatch.Normal3f( 0.0f, 1.0f, 0.0f); mirrorBatch.Vertex3f(-1.0f, 0.0f, 0.0f); mirrorBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); mirrorBatch.MultiTexCoord2f(0, 1.0f, 0.0f); mirrorBatch.Normal3f(0.0f, 1.0f, 0.0f); mirrorBatch.Vertex3f(1.0f, 0.0f, 0.0f); mirrorBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); mirrorBatch.MultiTexCoord2f(0, 1.0f, 1.0f); mirrorBatch.Normal3f(0.0f, 1.0f, 0.0f); mirrorBatch.Vertex3f(1.0f, 2.0f, 0.0f); mirrorBatch.Color4f(1.0f, 0.0f, 0.0f, 1.0f); mirrorBatch.MultiTexCoord2f(0, 0.0f, 1.0f); mirrorBatch.Normal3f( 0.0f, 1.0f, 0.0f); mirrorBatch.Vertex3f(-1.0f, 2.0f, 0.0f); mirrorBatch.End(); mirrorBorderBatch.Begin(GL_TRIANGLE_STRIP, 13); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 0.1f, 0.01f); mirrorBorderBatch.Normal3f(0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 0.0f, 0.01f); mirrorBorderBatch.Normal3f(0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(1.0f, 0.1f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(1.0f, 0.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(0.9f, 0.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(1.0f, 2.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(0.9f, 2.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(1.0f, 1.9f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 2.f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 1.9f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-0.9f, 2.f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-1.0f, 0.0f, 0.01f); mirrorBorderBatch.Normal3f( 0.0f, 0.0f, 1.0f); mirrorBorderBatch.Vertex3f(-0.9f, 0.0f, 0.01f); mirrorBorderBatch.End(); glGenTextures(1, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Create and bind an FBO glGenFramebuffers(1,&fboName); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboName); // Create depth renderbuffer glGenRenderbuffers(1, &depthBufferName); glBindRenderbuffer(GL_RENDERBUFFER, depthBufferName); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32, mirrorTexWidth, mirrorTexHeight); // Create the reflection texture glGenTextures(1, &mirrorTexture); glBindTexture(GL_TEXTURE_2D, mirrorTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, mirrorTexWidth, mirrorTexHeight, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Attach texture to first color attachment and the depth RBO glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mirrorTexture, 0); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBufferName); // Make sure all went well gltCheckErrors(); // Reset framebuffer binding glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); }
/** * This function does any needed initialization on the rendering context. * This is the first opportunity to do any OpenGL related tasks. */ void SetupRC() { // Blue background glClearColor(0.0f, 0.0f, 1.0f, 1.0f ); shaderManager.init(); glEnable(GL_DEPTH_TEST); gltCreateCylinder(bckgrndCylBatch, 4.0f, 4.0f, 5.2f, 1024, 1); gltCreateDisk(diskBatch, 0.0f, 1.5f, 40, 10); glass1Batch.begin(GL_TRIANGLE_FAN, 4, 1); glass1Batch.Vertex3f(-1.0f, -1.0f, 0.0f); glass1Batch.Vertex3f(1.0f, -1.0f, 0.0f); glass1Batch.Vertex3f(1.0f, 1.0f, 0.0f); glass1Batch.Vertex3f(-1.0f, 1.0f, 0.0f); glass1Batch.end(); glass2Batch.begin(GL_TRIANGLE_FAN, 4, 1); glass2Batch.Vertex3f(0.0f, 1.0f, 0.0f); glass2Batch.Vertex3f(1.0f, 0.0f, 0.0f); glass2Batch.Vertex3f(0.0f, -1.0f, 0.0f); glass2Batch.Vertex3f(-1.0f, 0.0f, 0.0f); glass2Batch.end(); glass3Batch.begin(GL_TRIANGLE_FAN, 3, 1); glass3Batch.Vertex3f(0.0f, 1.0f, 0.0f); glass3Batch.Vertex3f(1.0f, -1.0f, 0.0f); glass3Batch.Vertex3f(-1.0f, -1.0f, 0.0f); glass3Batch.end(); glass4Batch.begin(GL_TRIANGLE_FAN, 4, 1); glass4Batch.Vertex3f(-1.0f, 1.0f, 0.0f); glass4Batch.Vertex3f(1.0f, 0.5f, 0.0f); glass4Batch.Vertex3f(1.0f, -1.0f, 0.0f); glass4Batch.Vertex3f(-1.0f, -0.5f, 0.0f); glass4Batch.end(); glGenTextures(2, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); gltLoadTextureBMP("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); glBindTexture(GL_TEXTURE_2D, textures[1]); gltLoadTextureBMP("start_line.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // create and bind an FBO glGenFramebuffers(1, &msFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msFBO); // create depth texture glGenTextures(1, &depthTextureName); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depthTextureName); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_DEPTH_COMPONENT24, screenWidth, screenHeight, GL_FALSE); // setup HDR render texture glGenTextures(1, msTexture); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msTexture[0]); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGBA8, screenWidth, screenHeight, GL_FALSE); // create and bind FBO glGenFramebuffers(1, &msFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msFBO); // attach texture to first color attachment and depth RBO glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msTexture[0], 0); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depthTextureName, 0); // reset framebuffer binding glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Load oit resolve shader oitResolve = gltLoadShaderWithFileEx("basic.vs", "oitResolve.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(oitResolve, 0, "oColor"); glLinkProgram(oitResolve); // Load multisample resolve shader msResolve = gltLoadShaderWithFileEx("basic.vs", "msResolve.fs", 3, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord0"); glBindFragDataLocation(msResolve, 0, "oColor"); glLinkProgram(msResolve); // Make sure all went well gltCheckErrors(oitResolve); gltCheckErrors(msResolve); int numMasks = 0; glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &numMasks); log("GL_MAX_SAMPLE_MASK_WORDS: %d", numMasks); }