1. 程式人生 > >openGl深度測試,剔除背面測試

openGl深度測試,剔除背面測試

#include "stdafx.h"
#include<Windows.h>
#include"gl.h"
#include"glut.h"


//旋轉引數
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;


//深度測試技術
BOOL bDepth = FALSE;
//剔除開關
BOOL bCull = FALSE;


//渲染場景
void SetupRC()
{
//設定視窗背景顏色為黑色
glClearColor(0.0f, 0.0f, 0.0f,1.0f);
//指定多邊形的陰影模式為平面陰暗模式
glShadeModel(GL_FLAT);
}
//改變大小
void ChangeSize(int w, int h)
{
if (h == 0) h = 1;
glViewport(0, 0, w, h);//圖形顯示位置
glMatrixMode(GL_PROJECTION);//切換到投影矩陣
glLoadIdentity();//將當前的使用者的座標系統的原點移到螢幕中心
if (w <= h)
glOrtho(-100.0f, 100.0f, -100.0f*h / w, 100.0*h / w, -100.0f, 100.0f);
else
glOrtho(-100.0f*w/h, 100.0f*w/h, -100.0f , 100.0f, -100.0f, 100.0f);
glMatrixMode(GL_MODELVIEW);//對模型視景矩陣操作
glLoadIdentity();


}


//在視窗中繪製稜錐
void RenderScene(void)
{
//清除顏色及深度緩衝區
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


//是否開啟深度測試技術
if (bDepth)
glEnable(GL_DEPTH_TEST);
else
glDisable(GL_DEPTH_TEST);


//是否開啟剔除
if (bCull)
glEnable(GL_CULL_FACE);
else
glDisable(GL_CULL_FACE);


//旋轉圖形
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);


// 指定順時針繞法的多邊形為多邊形正面
glFrontFace(GL_CW);
//繪製三稜錐
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0, 0.0, 100.0);

glVertex3f(0.0, 60.0, 0.0);
glColor3f(1.0, 0.0, 0.0);


glVertex3f(60.0, -60.0, 0.0);
glColor3f(0.0, 1.0, 0.0);


glVertex3f(-60.0, -60.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
 
glVertex3f(0.0, 60.0, 0.0);


   glEnd();
 
   //繪製三稜錐底面
   glBegin(GL_TRIANGLE_FAN);


   glVertex3f(0.0, 60.0, 0.0);
   glVertex3f(60.0, -60.0, 0.0);
   glColor3f(1.0, 1.0, 0.0);
   glVertex3f(-60.0, -60.0, 0.0);
   glEnd();


   glPopMatrix();
   //重新整理命令緩衝區
   glutSwapBuffers();


}


//控制上下左右方向鍵
void ControlKeys(int key, int x, int y)
{
if (key == GLUT_KEY_UP)
xRot -= 5.0f;
if (key == GLUT_KEY_DOWN)
xRot += 5.0f;
if (key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if (key == GLUT_KEY_RIGHT)
yRot += 5.0f;
if (xRot > 356.0f) xRot = 0.0f;
if (xRot <-1.0f) xRot = 355.0f;
if (yRot > 356.0f) yRot = 0.0f;
if (yRot <-1.0f) yRot = 355.0f;
//重新整理視窗
glutPostRedisplay();


}


//建立選單
void CreateMenu(int value)
{
switch (value)
{
case 1:
bDepth = !bDepth;
break;
case 2:
bCull = !bCull;
break;
default:
break;
}
glutPostRedisplay();//標記當前視窗需要重新繪製


}


int _tmain(int argc, _TCHAR* argv[])
{
glutInit(&argc, (char**)argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("繪製三稜錐");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);

glutSpecialFunc(ControlKeys);
//建立選單
glutCreateMenu(CreateMenu);
//新增選單
glutAddMenuEntry("深度測試技術", 1);
glutAddMenuEntry("剔除背面測試", 2);
glutAttachMenu(GLUT_RIGHT_BUTTON);




SetupRC();
glutMainLoop();//進入GLUT事件處理迴圈
return 0;
}