01BIM社区

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1688|回复: 0

glEnable(GL_CULL_FACE)作用

[复制链接]

156

主题

647

帖子

2540

积分

金牌会员

Rank: 6Rank: 6

积分
2540
发表于 2015-10-19 15:03:54 | 显示全部楼层 |阅读模式
本帖最后由 tzbm123456 于 2015-10-19 15:05 编辑

glEnable(GL_CULL_FACE) :开启剔除操作效果;
glEnable(GL_CULL_FACE)来打开在曲面是背面不显示功能,
glDisable(GL_CULL_FACE)来关闭在曲面是背面不显示功能。

Demo在没有打开在曲面是背面不显示功能显示效果如下:


通过单击鼠标右键弹出菜单切换打开或关闭在曲面是背面不显示功能效果如下:


Demo在打开在曲面是背面不显示功能显示效果如下:



[cpp] view plaincopy
// GlutBackAndFrontDemo.cpp : 定义控制台应用程序的入口点。  
//  

#include "stdafx.h"  
#include <gl/glut.h>  
#include <math.h>  
//圆周率宏  
#define GL_PI 3.1415f  
//获取屏幕的宽度  
GLint SCREEN_WIDTH=0;  
GLint SCREEN_HEIGHT=0;  
//设置程序的窗口大小  
GLint windowWidth=400;  
GLint windowHeight=300;  
//绕x轴旋转角度  
GLfloat xRotAngle=0.0f;  
//绕y轴旋转角度  
GLfloat yRotAngle=0.0f;  
//是否打开不显示背面功能  
GLint cullFace=0;  
//菜单回调函数  
void processMenu(int value){  
    switch(value){  
        case 1:  
            cullFace=!cullFace;//切换打开或关闭不显示背面功能  
            break;  
        default:  
            break;  
    }  
    //重新绘制  
    glutPostRedisplay();  
}  


//显示回调函数  
void renderScreen(void){  
    GLfloat x,y,z,angle;  
    //把整个窗口清理为当前清理颜色:黑色  
    glClear(GL_COLOR_BUFFER_BIT);  
    //将当前Matrix状态入栈  
    glPushMatrix();  
    //坐标系绕x轴旋转xRotAngle  
    glRotatef(xRotAngle,1.0f,0.0f,0.0f);  
    //坐标系绕y轴旋转yRotAngle  
    glRotatef(yRotAngle,0.0f,1.0f,0.0f);  
    if(cullFace)  
        glEnable(GL_CULL_FACE);//打开不显示背面功能  
    else  
        glDisable(GL_CULL_FACE);//关闭不显示背面功能  
    //进行平滑处理   
    glEnable(GL_POINT_SMOOTH);  
    glHint(GL_POINT_SMOOTH,GL_NICEST);  
    glEnable(GL_LINE_SMOOTH);  
    glHint(GL_LINE_SMOOTH,GL_NICEST);  
    //使用白色绘制坐标系  
    glColor3f(1.0f,1.0f,1.0f);  
    //绘制坐标系  
    glBegin(GL_LINES);  
        glVertex3f(-80.0f,0.0f,0.0f);  
        glVertex3f(80.0f,0.0f,0.0f);  
        glVertex3f(0.0f,-80.0f,0.0f);  
        glVertex3f(0.0f,80.0f,0.0f);  
        glVertex3f(0.0f,0.0f,-80.0f);  
        glVertex3f(0.0f,0.0f,80.0f);  
    glEnd();  

    glPushMatrix();  
    glTranslatef(80.0f,0.0f,0.0f);  
    glRotatef(90.0f,0.0f,1.0f,0.0f);  
    glutWireCone(3,6,10,10);  
    glPopMatrix();  

    glPushMatrix();  
    glTranslatef(0.0f,80.0f,0.0f);  
    glRotatef(-90.0f,1.0f,0.0f,0.0f);  
    glutWireCone(3,6,10,10);  
    glPopMatrix();  

    glPushMatrix();  
    glTranslatef(0.0f,0.0f,80.0f);  
    glRotatef(90.0f,0.0f,0.0f,1.0f);  
    glutWireCone(3,6,10,10);  
    glPopMatrix();  



    //坐标系平移到(-20.0f,0.0f,00.0f)  
    glPushMatrix();  
    glTranslatef(-20.0f,0.0f,00.0f);  
    //GL_FLAT使用单色模式填充三角形   
    //GL_SMOOTH使用颜色平滑变换模式填充三角形   
    glShadeModel(GL_FLAT);  
    //使用GL_TRIANGLE_STRIP绘制三角形  
    glBegin(GL_TRIANGLE_STRIP);  
        //使用红色绘制第一个逆时针三角形  
        glColor3f(1.0f,0.0f,0.0f);  
        glVertex3f(0.0f,0.0f,0.0f);  
        glVertex3f(-25.0f,25.0f,0.0f);  
        glVertex3f(-50.0f,0.0f,0.0f);  
    //结束GL_TRIANGLE_STRIP绘制三角形  
    glEnd();  
    glPopMatrix();  

    //坐标系平移到(20.0f,0.0f,00.0f)  
    glPushMatrix();  
    glTranslatef(20.0f,0.0f,00.0f);  
    //GL_FLAT使用单色模式填充三角形   
    //GL_SMOOTH使用颜色平滑变换模式填充三角形   
    glShadeModel(GL_SMOOTH);  
    //使用GL_TRIANGLE_STRIP绘制三角形  
    glBegin(GL_TRIANGLE_STRIP);  
        //使用蓝色绘制第一个顺时针三角形  
        glColor3f(0.0f,0.0f,1.0f);  
        glVertex3f(0.0f,0.0f,0.0f);  
        glVertex3f(25.0f,25.0f,0.0f);  
        glVertex3f(50.0f,0.0f,0.0f);  
    //结束GL_TRIANGLE_STRIP绘制三角形  
    glEnd();  
    glPopMatrix();  



    //恢复压入栈的Matrix  
    glPopMatrix();  
    //交换两个缓冲区的指针  
    glutSwapBuffers();  
}  
//设置Redering State   
void setupRederingState(void){  
    //设置清理颜色为黑色  
    glClearColor(0.0f,0.0,0.0,1.0f);  
    //设置绘画颜色为绿色  
    glColor3f(0.0f,1.0f,0.0f);  
    //多边形背部使用线条填充  
    glPolygonMode(GL_BACK,GL_LINE);  
    //改变正反面  
    //glFrontFace(GL_CW);  
}  
//窗口大小变化回调函数  
void changSize(GLint w,GLint h){  
    //横宽比率  
    GLfloat ratio;  
    //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  
    GLfloat coordinatesize=100.0f;  
    //窗口宽高为零直接返回  
    if((w==0)||(h==0))  
        return;  
    //设置视口和窗口大小一致  
    glViewport(0,0,w,h);  
    //对投影矩阵应用随后的矩阵操作  
    glMatrixMode(GL_PROJECTION);  
    //重置当前指定的矩阵为单位矩阵   
    glLoadIdentity();  
    ratio=(GLfloat)w/(GLfloat)h;  
    //正交投影  
    if(w<h)  
        glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);  
    else  
        glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);  
    //对模型视图矩阵堆栈应用随后的矩阵操作  
    glMatrixMode(GL_MODELVIEW);  
    //重置当前指定的矩阵为单位矩阵   
    glLoadIdentity();  
}  

//按键输入处理回调函数  
void specialKey(int key,int x,int y){  

    if(key==GLUT_KEY_UP){  
        xRotAngle-=5.0f;  
    }  
    else if(key==GLUT_KEY_DOWN){  
        xRotAngle+=5.0f;  
    }  
    else if(key==GLUT_KEY_LEFT){  
        yRotAngle-=5.0f;  
    }  
    else if(key==GLUT_KEY_RIGHT){  
        yRotAngle+=5.0f;  
    }  
    //重新绘制  
    glutPostRedisplay();  
}  

int main(int argc, char* argv[])  
{  
    //初始化glut   
    glutInit(&argc,argv);  
    //使用双缓冲区模式  
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);  
    //获取系统的宽像素  
    SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);  
    //获取系统的高像素  
    SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);  
    //创建窗口,窗口名字为OpenGL BackAndFront Demo  
    glutCreateWindow("OpenGL BackAndFront Demo");  
    //菜单回调函数  
    glutCreateMenu(processMenu);  
    //添加菜单  
    glutAddMenuEntry("Toggle cull face",1);  
    //将菜单绑定到鼠标右键上  
    glutAttachMenu(GLUT_RIGHT_BUTTON);  
    //设置窗口大小  
    glutReshapeWindow(windowWidth,windowHeight);  
    //窗口居中显示  
    glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);  
    //窗口大小变化时的处理函数  
    glutReshapeFunc(changSize);  
    //设置显示回调函数   
    glutDisplayFunc(renderScreen);  
    //设置按键输入处理回调函数  
    glutSpecialFunc(specialKey);  
    //设置全局渲染参数  
    setupRederingState();  
    glutMainLoop();  
    return 0;  
}  

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|01BIM社区 - 最专业的BIM技术交流平台 ( 渝ICP备15000873号 )

GMT+8, 2024-5-19 22:48 , Processed in 0.348693 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表