openGl深度測試,剔除背面測試
阿新 • • 發佈:2019-02-17
#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;
}
#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;
}