int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH); glutInitWindowPosition(100,100); glutInitWindowSize(RENDER_WIDTH,RENDER_HEIGHT); glutCreateWindow("GLSL Shadow mapping"); // This call will grab openGL extension function pointers. // This is not necessary for macosx and linux #ifdef _WIN32 getOpenGLFunctionPointers(); #endif generateShadowFBO(); loadShadowShader(); // This is important, if not here, FBO's depthbuffer won't be populated. glEnable(GL_DEPTH_TEST); glClearColor(0,0,0,1.0f); glEnable(GL_CULL_FACE); glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); glutDisplayFunc(renderScene); glutIdleFunc(renderScene); glutKeyboardFunc(processNormalKeys); glutMainLoop(); }
SDL_RenderTarget* Create_pBuffer(unsigned int width, unsigned int height){ printf("Create_pBuffer(%ud,%ud);\n",width,height); #ifdef _WIN32 if (!windowsOpenGLInitialized){ getOpenGLFunctionPointers(); windowsOpenGLInitialized=1; } #elif defined(__linux__) initializeGLEW(); #endif GLuint textureId; glGenTextures(1, &textureId); glBindTexture(GL_TEXTURE_2D, textureId); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0); // create a framebuffer object GLuint fboId; glGenFramebuffers(1, &fboId); glBindFramebuffer(GL_FRAMEBUFFER, fboId); // attach the texture to FBO color attachment point glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, textureId, 0); int attachError = glGetError(); if (attachError != GL_NO_ERROR){ switch(attachError){ printf("error in glFramebufferTexture2D.\n"); } } GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if(status != GL_FRAMEBUFFER_COMPLETE){ printf("An error occured creating the pBuffer.\n"); switch (status) { case GL_FRAMEBUFFER_UNDEFINED : printf("GL_FRAMEBUFFER_UNDEFINED \n"); break ; case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT : printf("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT \n"); break ; case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT : printf("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT \n"); break ; case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER : printf("GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER \n"); break ; case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER : printf("GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER \n"); break ; case GL_FRAMEBUFFER_UNSUPPORTED : printf("GL_FRAMEBUFFER_UNSUPPORTED \n"); break ; case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE : printf("GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE \n"); break ; //case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE : printf("GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE \n"); break ; //case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS : printf("GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS \n"); break ; default: printf("error code unknow: %d",status); } } renderBuffers[renderBuffersCounter].fboID = fboId; renderBuffers[renderBuffersCounter].textureID = textureId; renderBuffers[renderBuffersCounter].w = width; renderBuffers[renderBuffersCounter].h = height; renderBuffers[renderBuffersCounter].id = renderBuffersCounter; renderBuffersCounter++; glBindFramebuffer(GL_FRAMEBUFFER, 0); printf("pBuffer created ID= %d.\n",renderBuffers[renderBuffersCounter-1].id); return &renderBuffers[renderBuffersCounter-1].id; }