在上一篇OpenGL 繪製傘面基礎上修改main.cpp
文件,完成此demo
。緩存
深度是指該像素點和視角的距離,也就是z
值。bash
深度緩衝區是存儲像素點深度值的一塊內存區域,z
值越大距離視角越遠。oop
深度測試是指在繪圖時,⾸先將表面對應的像素的深度值與當前深度緩衝區中的值進行比較. 若是大於深度緩衝區中的值,則丟棄這部分.不然利⽤這個像素對應的深度值和顏⾊值.分別更新深度緩衝區和顏⾊緩存區。post
若是不開啓深度測試則有可能出現距離較遠的元素後繪製,則會遮擋前面的元素。測試
glEnable(GL_DEPTH_TEST);
複製代碼
關閉深度測試ui
glDisable(GL_DEPTH_TEST);
複製代碼
修改OpenGL 繪製傘面項目的main.cpp
文件,以下:spa
#include "GLTools.h"
#include "GLMatrixStack.h"
#include "GLFrame.h"
#include "GLFrustum.h"
#include <math.h>
#include <GLUT/GLUT.h>
GLShaderManager shaderManager;
GLTriangleBatch cylinderBatch;
GLFrame viewFrame;
GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLFrustum viewFrustum;
void setupRC() {
glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
shaderManager.InitializeStockShaders();
viewFrame.MoveForward(10.0f);
gltMakeCylinder(cylinderBatch, 0.3f, 0.8f, 0.8f, 100, 1);
}
void changeSize(int w, int h) {
glViewport(0, 0, w, h);
viewFrustum.SetPerspective(20.0f, float(w) / float(h), 5.0f, 20.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
}
void specialKeys(int key, int x, int y) {
if (key == GLUT_KEY_UP) {
viewFrame.RotateWorld(m3dDegToRad(-4.0), 1.0f, 0.0f, 0.0f);
}
if (key == GLUT_KEY_DOWN) {
viewFrame.RotateWorld(m3dDegToRad(4.0), 1.0f, 0.0f, 0.0f);
}
if (key == GLUT_KEY_RIGHT) {
viewFrame.RotateWorld(m3dDegToRad(4.0), 0.0f, 1.0f, 0.0f);
}
if (key == GLUT_KEY_LEFT) {
viewFrame.RotateWorld(m3dDegToRad(-4.0), 0.0f, 1.0f, 0.0f);
}
glutPostRedisplay();
}
void renderScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
modelViewMatrix.PushMatrix(viewFrame);
GLfloat vOrange[] = {1.0f,0.6f,0.0f,1.0f};
shaderManager.UseStockShader(GLT_SHADER_DEFAULT_LIGHT,modelViewMatrix.GetMatrix(), projectionMatrix.GetMatrix(),vOrange);
cylinderBatch.Draw();
modelViewMatrix.PopMatrix();
glDisable(GL_DEPTH_TEST);
glutSwapBuffers();
}
int main(int argc, char* argv[]) {
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("dowZhang");
glutReshapeFunc(changeSize);
glutSpecialFunc(specialKeys);
glutDisplayFunc(renderScene);
GLenum err = glewInit();
if (GLEW_OK != err) {
return 1;
}
setupRC();
glutMainLoop();
return 0;
}
複製代碼
不開啓深度測試: 3d
開啓深度測試後:code