OpenGL 深度測試

前言

在上一篇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

相關文章
相關標籤/搜索