Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef _WIN32
- #include "windows.h"
- #endif
- #include <GL/glut.h>
- #include <GL/glext.h>
- #include <stdio.h>
- PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers=0;
- PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers=0;
- PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer=0;
- PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus=0;
- PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer=0;
- PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers=0;
- PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers=0;
- PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer=0;
- PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage=0;
- PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D=0;
- void checkFBO() {
- GLenum status;
- status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
- if (status != GL_FRAMEBUFFER_COMPLETE) {
- printf("Error: %d", status);
- }
- }
- GLuint fboId;
- GLuint texId;
- GLuint depthId;
- int width = 256;
- int height = 256;
- void init() {
- char *exStr =(char*)glGetString(GL_EXTENSIONS);
- if (strstr(exStr,"GL_ARB_framebuffer_object")==NULL) {
- printf("GL_ARB_framebuffer_object not supported.\n");
- exit(1);
- } if (strstr(exStr,"GL_ARB_texture_float")==NULL) {
- printf("GL_ARB_texture_float not supported.\n");
- exit(1);
- }
- #ifdef _WIN32
- #define GET_PROC_ADDRESS(x) wglGetProcAddress(x);
- #else
- #define GET_PROC_ADDRESS(x) glXGetProcAddress((const GLubyte*)x);
- #endif
- glGenFramebuffers= (PFNGLGENFRAMEBUFFERSPROC) GET_PROC_ADDRESS("glGenFramebuffers");
- glBindFramebuffer= (PFNGLBINDFRAMEBUFFERPROC) GET_PROC_ADDRESS("glBindFramebuffer");
- glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) GET_PROC_ADDRESS("glDeleteFramebuffers");
- glCheckFramebufferStatus= (PFNGLCHECKFRAMEBUFFERSTATUSPROC) GET_PROC_ADDRESS("glCheckFramebufferStatus");
- glGenRenderbuffers=(PFNGLGENRENDERBUFFERSPROC)GET_PROC_ADDRESS("glGenRenderbuffers");
- glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) GET_PROC_ADDRESS("glBindRenderbuffer");
- glRenderbufferStorage= (PFNGLRENDERBUFFERSTORAGEPROC) GET_PROC_ADDRESS("glRenderbufferStorage");
- glDeleteRenderbuffers= (PFNGLDELETERENDERBUFFERSPROC) GET_PROC_ADDRESS("glDeleteRenderbuffers");
- glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) GET_PROC_ADDRESS("glFramebufferRenderbuffer");
- glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)GET_PROC_ADDRESS("glFramebufferTexture2D");
- }
- void initFBO() {
- glPushAttrib(GL_TEXTURE_BIT | GL_COLOR_BUFFER_BIT | GL_VIEWPORT_BIT);
- glGenTextures(1, &texId);
- glBindTexture(GL_TEXTURE_2D, texId);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
- glGenRenderbuffers(1, &depthId);
- glBindRenderbuffer(GL_RENDERBUFFER, depthId);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
- glGenFramebuffers(1, &fboId);
- glBindFramebuffer(GL_FRAMEBUFFER, fboId);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthId);
- glDrawBuffer(GL_COLOR_ATTACHMENT0);
- glReadBuffer(GL_NONE);
- glViewport(0, 0, width, height);
- checkFBO();
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glPopAttrib();
- }
- static void display(void) {
- glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);
- glBindFramebuffer(GL_FRAMEBUFFER, fboId);
- glDrawBuffer(GL_COLOR_ATTACHMENT0);
- glViewport(0, 0, width, height);
- glClearColor(0.2, 0.1, 0.3, 1.0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -5.0);
- glEnable(GL_DEPTH_TEST);
- glutSolidSphere(1.0, 32, 32);
- glPopAttrib();
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -3.0);
- glBindTexture(GL_TEXTURE_2D, texId);
- glEnable(GL_TEXTURE_2D);
- glDisable(GL_DEPTH_TEST);
- glBegin(GL_QUADS);
- glTexCoord2f(0.0f, 0.0f); glVertex2f(-0.5f, -0.5f);
- glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5f, -0.5f);
- glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5f, 0.5f);
- glTexCoord2f(0.0f, 1.0f); glVertex2f(-0.5f, 0.5f);
- glEnd();
- glDisable(GL_TEXTURE_2D);
- glBegin(GL_LINE_LOOP);
- glVertex2f(-0.5f, -0.5f);
- glVertex2f(0.5f, -0.5f);
- glVertex2f(0.5f, 0.5f);
- glVertex2f(-0.5f, 0.5f);
- glEnd();
- glutSwapBuffers();
- }
- static void reshape(int w, int h) {
- glViewport(0, 0, w, h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-1.0, 1.0, -1.0, 1.0, 0.01, 10.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- static void key(unsigned char key, int x, int y) {
- switch (key) {
- case 27 :
- case 'q':
- exit(0);
- break;
- }
- glutPostRedisplay();
- }
- static void idle(void) {
- glutPostRedisplay();
- }
- int main(int argc, char *argv[]) {
- glutInit(&argc, argv);
- glutInitWindowSize(640,480);
- glutInitWindowPosition(10,10);
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
- glutCreateWindow("OpenGL-Example");
- init();
- initFBO();
- glutReshapeFunc(reshape);
- glutDisplayFunc(display);
- glutKeyboardFunc(key);
- glutIdleFunc(idle);
- glutMainLoop();
- glDeleteFramebuffers(1, &fboId);
- glDeleteTextures(1, &texId);
- glDeleteRenderbuffers(1, &depthId);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement