读书人

超简单opengl有关问题解决立即给分

发布时间: 2012-12-14 10:33:07 作者: rapoo

超简单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然后再放大。
[其他解释]

引用:
我听说过,MSAA是比FXAA老的技术。理论上FXAA画质更好,资源更少,但是实际情况不得而知了.



你想要分数的话,或者使用MSAA调通程序,或者改成FXAA的程序实现同样的功能。
[其他解释]
引用:
我听说过,MSAA是比FXAA老的技术。理论上FXAA画质更好,资源更少,但是实际情况不得而知了.


你想要分数的话,或者使用MSAA调通程序,或者改成FXAA的程序实现同样的功能。 但是不能在效率上有损失。
[其他解释]
谁解决分数就全归谁啊!

读书人网 >VC/MFC

热点推荐