GLUT + OpenGL多采样抗锯齿(MSAA) [英] GLUT + OpenGL multisampling anti aliasing (MSAA)

查看:329
本文介绍了GLUT + OpenGL多采样抗锯齿(MSAA)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了绘制立方体的OpenGL应用程序. 我想添加抗锯齿,但没有成功. 也许有人可以提供帮助(用户Xcode 6.1.1,GLUT,OpenGL)?

I make OpenGL application that draw cube. I want to add anti aliasing but have no success. Maybe someone can help (User Xcode 6.1.1, GLUT, OpenGL) ?

我需要在没有外部库的情况下创建抗锯齿.

I need create antialiasing without ay external libraries.

以下代码的结果.

GLfloat xRotated, yRotated, zRotated; void init(void){
glClearColor(0,0,0,0);

glEnable (GL_DEPTH_TEST);

// Turn on antialiasing, and give hint to do the best
// job possible.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_MULTISAMPLE); } void DrawCube(void) {
glMatrixMode(GL_MODELVIEW);
// clear the drawing buffer.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0,0.0,-10.5);
glRotatef(xRotated,1.0,0.0,0.0);
// rotation about Y axis
glRotatef(yRotated,0.0,1.0,0.0);
// rotation about Z axis
glRotatef(zRotated,0.0,0.0,1.0);

glBegin(GL_QUADS);        // Draw The Cube Using quads
glColor3f(0.0f,1.0f,0.0f);    // Color Blue
glVertex3f( 1.0f, 1.0f,-1.0f);    // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f);    // Bottom Left Of The Quad (Top)
glVertex3f( 1.0f, 1.0f, 1.0f);    // Bottom Right Of The Quad (Top)
glColor3f(1.0f,0.5f,0.0f);    // Color Orange
glVertex3f( 1.0f,-1.0f, 1.0f);    // Top Right Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Top Left Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Bottom Left Of The Quad (Bottom)
glVertex3f( 1.0f,-1.0f,-1.0f);    // Bottom Right Of The Quad (Bottom)
glColor3f(1.0f,0.0f,0.0f);    // Color Red
glVertex3f( 1.0f, 1.0f, 1.0f);    // Top Right Of The Quad (Front)
glVertex3f(-1.0f, 1.0f, 1.0f);    // Top Left Of The Quad (Front)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Bottom Left Of The Quad (Front)
glVertex3f( 1.0f,-1.0f, 1.0f);    // Bottom Right Of The Quad (Front)
glColor3f(1.0f,1.0f,0.0f);    // Color Yellow
glVertex3f( 1.0f,-1.0f,-1.0f);    // Top Right Of The Quad (Back)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Top Left Of The Quad (Back)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Bottom Left Of The Quad (Back)
glVertex3f( 1.0f, 1.0f,-1.0f);    // Bottom Right Of The Quad (Back)
glColor3f(0.0f,0.0f,1.0f);    // Color Blue
glVertex3f(-1.0f, 1.0f, 1.0f);    // Top Right Of The Quad (Left)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Top Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Bottom Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Bottom Right Of The Quad (Left)
glColor3f(1.0f,0.0f,1.0f);    // Color Violet
glVertex3f( 1.0f, 1.0f,-1.0f);    // Top Right Of The Quad (Right)
glVertex3f( 1.0f, 1.0f, 1.0f);    // Top Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f, 1.0f);    // Bottom Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f,-1.0f);    // Bottom Right Of The Quad (Right)
glEnd();            // End Drawing The Cube

glFlush(); } void animation(void) {
yRotated += 0.1;
xRotated += 0.2;
DrawCube(); } void reshape(int x, int y) {
if (y == 0 || x == 0) return;  //Nothing is visible then, so return
//Set a new projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y);  //Use the whole window for rendering } int main(int argc, char** argv){
glutInit(&argc, argv);
//we initizlilze the glut. functions
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(DrawCube);
glutReshapeFunc(reshape);
//Set the function for the animation.
glutIdleFunc(animation);
glutMainLoop();
return 0; }

推荐答案

GLUT缺少样本数量的设置. Freeglut确实如此.要启用它,请使用

GLUT lacks the setting of the number of samples. Freeglut does. To enable it, use

glutSetOption(GLUT_MULTISAMPLE, 8);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);

记住要glEnable

void enableMultisample(int msaa)
{
    if (msaa)
    {
        glEnable(GL_MULTISAMPLE);
        glHint(GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST);

        // detect current settings
        GLint iMultiSample = 0;
        GLint iNumSamples = 0;
        glGetIntegerv(GL_SAMPLE_BUFFERS, &iMultiSample);
        glGetIntegerv(GL_SAMPLES, &iNumSamples);
        printf("MSAA on, GL_SAMPLE_BUFFERS = %d, GL_SAMPLES = %d\n", iMultiSample, iNumSamples);
    }
    else
    {
        glDisable(GL_MULTISAMPLE);
        printf("MSAA off\n");
    }   
}

这篇关于GLUT + OpenGL多采样抗锯齿(MSAA)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆