超简单opengl问题解决立即给分!
//fbo.c
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include <windows.h>
#include "gl\glew.h"
#define GLUT_DISABLE_ATEXIT_HACK
#include "glut.h"
#define CHECK_ERR \
if(glGetError() != GL_NO_ERROR) { const char* str = (const char*)gluErrorString(glGetError()); fprintf(stderr,"OpenGL Error:%s \n ",str); }
enum {Color, Depth, NumRenderbuffers};
GLuint framebuffer, renderbuffer[NumRenderbuffers];
int glExtCheckFramebufferStatus(char *errorMessage)
{
GLenum status;
status=glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
switch(status)
{
case GL_FRAMEBUFFER_COMPLETE_EXT:
break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
//Choose different formats
strcpy(errorMessage, "Framebuffer object format is unsupported by the video hardware. (GL_FRAMEBUFFER_UNSUPPORTED_EXT)(FBO - 820)");
return -1;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
strcpy(errorMessage, "Incomplete attachment. (GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT)(FBO - 820)");
return -1;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
strcpy(errorMessage, "Incomplete missing attachment. (GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT)(FBO - 820)");
return -1;
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
strcpy(errorMessage, "Incomplete dimensions. (GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT)(FBO - 820)");
return -1;
case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
strcpy(errorMessage, "Incomplete formats. (GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT)(FBO - 820)");
return -1;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
strcpy(errorMessage, "Incomplete draw buffer. (GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT)(FBO - 820)");
return -1;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
strcpy(errorMessage, "Incomplete read buffer. (GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT)(FBO - 820)");
return -1;
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT:
strcpy(errorMessage, "Incomplete multisample buffer. (GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT)(FBO - 820)");
return -1;
default:
//Programming error; will fail on all hardware
strcpy(errorMessage, "Some video driver error or programming error occured. Framebuffer object status is invalid. (FBO - 823)");
return -2;
}
return 1;
}
void drawTiangle()
{
glColor3f(0.0f,1.0f,0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f,1.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glEnd();
}
void init()
{
GLenum status;
GLint samples;
GLint bufs;
GLenum err;
char ErrorMessage[1024];
int value;
glEnable(GL_MULTISAMPLE_EXT);
//glHint(GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST);
CHECK_ERR;
glGetIntegerv (GL_SAMPLE_BUFFERS, &bufs);
glGetIntegerv(GL_MAX_SAMPLES_EXT, &samples);
printf("MSAA: buffers = %d samples = %d\n", bufs, samples);
glGenFramebuffersEXT(NumRenderbuffers,renderbuffer);
CHECK_ERR;
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT,renderbuffer[Color]);
CHECK_ERR;
//glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,GL_RGBA8, 256,256);
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT,4,GL_RGBA8, 256,256);
CHECK_ERR;
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT,renderbuffer[Depth]);
CHECK_ERR;
//glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,GL_DEPTH_COMPONENT, 256,256);
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT,4,GL_DEPTH_COMPONENT24, 256,256);
CHECK_ERR;
glGenFramebuffersEXT(1, & framebuffer);
CHECK_ERR;
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT,framebuffer);
CHECK_ERR;
glFramebufferRenderbufferEXT(GL_DRAW_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_RENDERBUFFER_EXT,renderbuffer[Color]);
CHECK_ERR;
glFramebufferRenderbufferEXT(GL_DRAW_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT,renderbuffer[Depth]);
CHECK_ERR;
status=glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT);
glEnable(GL_DEPTH_TEST);
CHECK_ERR;
value=glExtCheckFramebufferStatus(ErrorMessage);
}
void display()
{
GLenum status;
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT,framebuffer);
CHECK_ERR;
status=glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT);
glViewport(0,0,256,256);
CHECK_ERR;
//red
glClearColor(1.0,0.0,0.0,1.0);
CHECK_ERR;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
CHECK_ERR;
glClearDepth(0.0f);
CHECK_ERR;
drawTiangle();
CHECK_ERR;
glViewport(0,0,512,512);
CHECK_ERR;
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT,framebuffer);
CHECK_ERR;
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT,0);
CHECK_ERR;
status=glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT);
//blue
//glClearColor(0.0,0.0,1.0,1.0);
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glReadBuffer(GL_COLOR_ATTACHMENT0);
glBlitFramebufferEXT(0,0,255,255,0,0,511,511,GL_COLOR_BUFFER_BIT,GL_NEAREST);
status=glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT);
CHECK_ERR;
glutSwapBuffers();
CHECK_ERR;
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
glutInitWindowSize(512, 512);
glutInitWindowPosition(100, 100);
glutCreateWindow("Frame buffer object");
//Initialize the glew library.
glewInit();
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
调通并运行结果出来立即给分!
[最优解释]
我听说过,MSAA是比FXAA老的技术。理论上FXAA画质更好,资源更少,但是实际情况不得而知了.
[其他解释]
程序的目的是通过fbo先实现MSAA然后再放大。
[其他解释]