learnOpenGL-深度测试
深度测试:OpenGL将一个片段的深度值与深度缓冲的内容进行对比。执行一个深度测试,测试通过则深度缓冲将会更新为新的深度值。测试失败则片段被丢弃。
深度测试片段着色器及模版测试之后执行。
片段着色器中内置变量gl_FragCoord的z值即为深度值。
提前深度测试:允许深度测试在片段着色器之前运行。片段着色器通常开销很大。使用提前深度测试时,片段着色器不可写入深度值,因为OpenGl不能提前知道深度值。
默认禁用,glEnable(GL_DEPTH_TEST);启用
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);清楚上一帧深度缓冲
实际运用的深度缓冲是非线性的
深度冲突:两个平面或三角形z值一样,两个形状会不断切换前后顺序
防止深度冲突:
1.不要把多个物体放的太近,导致它们的一些三角形重叠
2.将进平面设置远一些,因为精度在靠近进平面时较高。(注意,进平面太远会导致近处的一些物体被裁减掉)
3.牺牲一些性能,使用更高精度的深度缓冲。大部分深度缓冲的精度都是24位,但现在大部分显卡支持32位
main.cpp
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include "shader.h"
#include "stb_image.h"
#include <glm.hpp>
#include <gtc/matrix_transform.hpp>
#include <gtc/type_ptr.hpp>
#include "Camera.h"
#include "Model.h"Camera* myCamera = new Camera(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(0.0f, 1.0f, 0.0f));void mouse_callback(GLFWwindow* window, double xpos, double ypos) {myCamera->mouseCb(xpos, ypos);
};void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{myCamera->scrollCb(xoffset, yoffset);
}GLfloat deltaTime = 0.0f;
GLfloat lastFrame = 0.0f;void processInput(GLFWwindow* window) {GLfloat currentFrame = glfwGetTime();deltaTime = currentFrame - lastFrame;lastFrame = currentFrame;if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {myCamera->pressKeyW(deltaTime);}if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {myCamera->pressKeyS(deltaTime);}if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {myCamera->pressKeyA(deltaTime);}if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {myCamera->pressKeyD(deltaTime);}
}glm::vec3 pointLightPositions[] = {glm::vec3(2.0f, 10.2f, 2.0f),glm::vec3(-2.3f, 7.3f, -4.0f)
};float cubeVertices[] = {// positions // texture Coords-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f
};
float planeVertices[] = {// positions // texture Coords (note we set these higher than 1 (together with GL_REPEAT as texture wrapping mode). this will cause the floor texture to repeat)5.0f, -0.5f, 5.0f, 2.0f, 0.0f,-5.0f, -0.5f, 5.0f, 0.0f, 0.0f,-5.0f, -0.5f, -5.0f, 0.0f, 2.0f,5.0f, -0.5f, 5.0f, 2.0f, 0.0f,-5.0f, -0.5f, -5.0f, 0.0f, 2.0f,5.0f, -0.5f, -5.0f, 2.0f, 2.0f
};int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow* window = glfwCreateWindow(800, 600, "test", nullptr, nullptr);if (window == nullptr){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);//glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);glfwSetCursorPosCallback(window, mouse_callback);glfwSetScrollCallback(window, scroll_callback);glewExperimental = GL_TRUE;if (glewInit() != GLEW_OK){std::cout << "Failed to initialize GLEW" << std::endl;glfwTerminate();return -1;}glViewport(0, 0, 800, 600);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));glEnableVertexAttribArray(2);glEnableVertexAttribArray(0);glBindVertexArray(0);GLuint cubeVAO, cubeVBO;glGenVertexArrays(1, &cubeVAO);glBindVertexArray(cubeVAO);glGenBuffers(1, &cubeVBO);glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertices), &cubeVertices, GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);glEnableVertexAttribArray(1);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));glBindVertexArray(0);unsigned int planeVAO, planeVBO;glGenVertexArrays(1, &planeVAO);glGenBuffers(1, &planeVBO);glBindVertexArray(planeVAO);glBindBuffer(GL_ARRAY_BUFFER, planeVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(planeVertices), &planeVertices, GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);glEnableVertexAttribArray(1);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));glBindVertexArray(0);GLuint tex;glGenTextures(1, &tex);int width, height, nrComponents;unsigned char* image = stbi_load("container.jpg", &width, &height, &nrComponents, 0);if (image) {GLenum format;if (nrComponents == 1)format = GL_RED;else if (nrComponents == 3)format = GL_RGB;else if (nrComponents == 4)format = GL_RGBA;glBindTexture(GL_TEXTURE_2D, tex);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, format, GL_UNSIGNED_BYTE, image);glGenerateMipmap(GL_TEXTURE_2D);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);stbi_image_free(image);}glm::mat4 model;glm::mat4 view;glm::mat4 projection;glEnable(GL_DEPTH_TEST);//深度测试函数glDepthFunc(GL_LESS);/** GL_ALWAYS 永远通过深度测试* GL_NEVER 永远不通过深度测试* GL_LESS 在片段深度值小于缓冲的深度值时通过测试* GL_EQUAL 在片段深度值等于缓冲区的深度值时通过测试* GL_LEQUAL 在片段深度值小于等于缓冲区的深度值时通过测试* GL_GREATER 在片段深度值大于缓冲区的深度值时通过测试* GL_NOTEQUAL 在片段深度值不等于缓冲区的深度值时通过测试* GL_GEQUAL 在片段深度值大于等于缓冲区的深度值时通过测试*/Shader* testShader = new Shader("test.vert", "test.frag");Shader* lightShader = new Shader("test.vert", "light.frag");while (!glfwWindowShouldClose(window)){processInput(window);glfwPollEvents();glClearColor(0.1f, 0.1f, 0.1f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);testShader->Use();glUniform1i(glGetUniformLocation(testShader->getProgram(), "texture1"), 0);glBindVertexArray(cubeVAO);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, tex);view = myCamera->getViewMat4();glUniformMatrix4fv(glGetUniformLocation(testShader->getProgram(), "view"), 1, GL_FALSE, glm::value_ptr(view));projection = glm::perspective(glm::radians(myCamera->getFov()), 800.0f / 600.0f, 0.1f, 100.0f);glUniformMatrix4fv(glGetUniformLocation(testShader->getProgram(), "projection"), 1, GL_FALSE, glm::value_ptr(projection));model = glm::translate(model, glm::vec3(-1.0f, 0.0f, -1.0f));glUniformMatrix4fv(glGetUniformLocation(testShader->getProgram(), "model"), 1, GL_FALSE, glm::value_ptr(model));glDrawArrays(GL_TRIANGLES, 0, 36);model = glm::mat4(1.0f);model = glm::translate(model, glm::vec3(2.0f, 0.0f, 0.0f));glUniformMatrix4fv(glGetUniformLocation(testShader->getProgram(), "model"), 1, GL_FALSE, glm::value_ptr(model));glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(planeVAO);glUniformMatrix4fv(glGetUniformLocation(testShader->getProgram(), "model"), 1, GL_FALSE, glm::value_ptr(glm::mat4(1.0f)));glDrawArrays(GL_TRIANGLES, 0, 6);glBindVertexArray(0);glfwSwapBuffers(window);}glfwTerminate();return 0;
}
顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoords;out vec2 TexCoords;uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;void main()
{TexCoords = aTexCoords; gl_Position = projection * view * model * vec4(aPos, 1.0);
}
片段着色器
#version 330 core
out vec4 FragColor;in vec2 TexCoords;uniform sampler2D texture1;float near = 0.1;
float far = 100.0; float LinearizeDepth(float depth)
{float z = depth * 2.0 - 1.0; // back to NDC [0,1]变换到[-1,1](标准化设备坐标/裁剪空间)return (2.0 * near * far) / (far + near - z * (far - near));
}void main()
{ FragColor = texture(texture1, TexCoords);//FragColor = vec4(vec3(gl_FragCoord.z), 1.0);//float depth = LinearizeDepth(gl_FragCoord.z) / far; // 为了演示除以 far//FragColor = vec4(vec3(depth), 1.0);
}
learnOpenGL-深度测试相关推荐
- OpenGL-坐标系统,进入3D世界(深度测试)
目录 坐标系统简介 z缓冲 举个栗子 代码 main.cpp vertexSource.txt fragmentSource.txt 截图 参考:LearnOpenGL 坐标系统简介 将坐标变换为标准 ...
- LearnOpenGL 入门—摄像机
文章目录 写在前面 摄像机 摄像机/观察空间 摄像机位置 摄像机方向 右轴 上轴 Look At 自由移动 移动速度 视角移动 欧拉角 鼠标输入 缩放 摄像机类 总结 练习 写在前面 原文链接.原 ...
- LearnOpenGL 光照—多光源
文章目录 写在前面 多光源 定向光 点光源 合成结果 总结 练习 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题. 多光源 我们在前面的教程中已经学 ...
- OpenGL学习笔记(七)-深度测试-模板测试-混合
参考网址:LearnOpenGL 中文版 第四章 高级OpenGL 4.1 深度测试 4.1.1 深度缓冲 1.深度缓冲用来防止被阻挡的面渲染到其它面的前面,由窗口系统自动创建,在每个片段中储存了它的 ...
- LearnOpenGL学习笔记—高级光照 09:SSAO
LearnOpenGL学习笔记-高级光照 09:SSAO 1 原理引入 2 样本缓冲 3 法向半球 4 随机核心转动 5 SSAO着色器 6 环境遮蔽模糊 7 应用环境遮蔽 8 动手试试 8.0 个人 ...
- opengl 投影矩阵和深度测试
写在前面 上一节我们使用AssImp加载了3d模型,效果已经令人激动了.但是绘制效率和场景真实感还存在不足,接下来我们还是要保持耐心,继续学习一些高级主题,等学完后面的高级主题,我们再次来改进我们加 ...
- LearnOpenGL学习笔记——阴影
阴影 阴影是光线遮挡的结果:当一个光源的光线由于其他物体的阻挡不能够达到一个物体表面的时候,那么这个物体就在阴影中了. 阴影可以让场景更加真实 阴影映射(Shadow Mapping) 阴影映射(Sh ...
- LearnOpenGL 模型加载—模型(二 绘制模型)
文章目录 写在前面 和箱子模型告别 坑点 回到主题 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题. 和箱子模型告别 所以,让我们导入一个由真正的艺 ...
- LearnOpenGL 光照—材质
文章目录 写在前面 材质 设置材质 光的属性 不同的光源颜色 总结 练习 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题. 材质 在现实世界里,每个 ...
- LearnOpenGL 光照—光照贴图
文章目录 写在前面 光照贴图 漫反射贴图 镜面光贴图 采样镜面光贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题. 光照贴图 在上一节中, ...
最新文章
- java struts技术_java技术框架之:struts
- 近期活动盘点:2019第六届世界互联网大会、面向智慧城市的人本尺度城市形态:理论方法与实践讲座、高级管理人员AI大数据能力研修班...
- 网络推广专员浅析在网站导航设计排版中应如何深入完成网络推广?
- QMutex pointer is misaligned的问题
- 可视化应用实战案例:metacoder-相关进化树图的绘制
- 西安电子科技大学第16届程序设计竞赛 C题
- centos service 无法用
- win7系统如何清理系统日志
- 判断一棵树是否为完全二叉树的算法c语言_别再翻了,面试二叉树看这 11 个就够了!||CSDN博客精选...
- mysql-conn.php_PHP连接MySQL方式
- 《用户故事与敏捷方法》读书笔记 04 客户团队
- 最新Jrebel激活码,Jrebel激活激活服务,Jrebel激活码,Jrebel破解
- vue element-ui之分页组件的封装
- c# 第32节 类的继承
- c++中transform函数的应用
- java se 计算机专业技能-Java专项练习(选择题)(三)
- 2021年11月14日
- 对计算机会计上机课的心得,会计电算化的心得体会
- 密码学安全性证明中的挑战者和攻击者
- 设计模式(Java)—Interpreter模式