在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。

1. 深度

深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!
深度值(Z值)越大,则离摄像机越远。
这里写图片描述

2. 深度缓存

深度值是存贮在深度缓存里面的,我们用深度缓存的位数来衡量深度缓存的精度。深度缓存位数越高,则精确度越高,目前的显卡一般都可支持16位的Z Buffer,一些高级的显卡已经可以支持32位的Z Buffer,但一般用24位Z Buffer就已经足够了。
这里写图片描述

3. 深度测试

将要渲染的物体的Z值对比G-Buffer中的值

1. ZWrite On/Off

是否将要渲染的物体的深度写入深度缓冲区
仅控制深度测试的开关,具体要不要将Z写入深度缓冲要看ZTest

2. ZTest
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
  • Less:将要渲染的像素的深度要小于G-buffer里面的深度值才写
  • Greater:将要渲染的像素的Z值大于G-buffer中的深度值才写
  • Always: 总是写入
ZWrite Ztest 更新G-buffer的Z 更新G-buffer的RGBA
On 通过
On 不通过 × ×
Off 通过 ×
Off 不通过 × ×
3. Offset 用于深度相同时做微调
Offset Factor, Units

允许您通过两个参数factor 和 units指定深度偏移。
Factor 缩放Z在多边形中相对于 X 或 Y 的最大斜率,值越小越靠近相机。
units 缩放最小可分辨的深度缓冲值。
这允许你强制一个多边形被画在另一个多边形上,尽管它们实际上处于同一位置。

ShaderLab: Culling & Depth Testing
ShaderLab: Culling & Depth Testing(中文)
深度测试

介绍在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。1. 深度深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值! ... 创建两个Cube,一个蓝色距离相机近点;一个红色距离相机远点。如图所示 红 Shader 和蓝 Shader 使用相同的代码,但是 Shader 的名字要不一样,方便后面进行对比 测试 。 红蓝色 Shader 代码如下: Shader "My/Sample Shader 2" Properties _Color("Col... 人物走到建筑后面,被建筑挡住的部分做特殊显示、没有被建筑挡住的部分正常渲染。 想要实现这种效果,关键的要点是 ZTest. 今天借助 unity 了解了 ZTest 机制.再此做一下总结. 创建一个空场景,两个 cube,距离近的是 cube_1, 远的是 cube_2 分别给 cube_1 ,cube_2 写 shader cube_1 的 shader 叫做 Sh... 在片元着色器对所有的片元着色之后, GPU会对每个片元执行 深度 测试 来决定遮挡关系. 为什么需要 深度 测试 我们知道渲染的任务是将三维的模型世界转换到二维图像, 最终会生成为一幅图像, 存放到帧缓存中, 缓存中的每一个位置存储着颜色值. 在这个过程中, 由于是三维空间到二维图像的转换, 二维图像的每个位置可能会被多次映射, 即被多个片 实现这个效果需要两个pass 1. 绘制被遮挡部分,即 深度 测试 Greater ,且不写入 深度 缓冲区(防止印象其他物体的 深度 对比),剩下的 xray效果就比较容易,同一 空间 下通过 点积 处理 2. 正常绘制,即 深度 测试 LEqual ,且写入 深度 缓冲区(正常与其他物体遮挡) 深度 纹理实际就是一张渲染纹理,只不过它里面存储的像素值不是颜色值,而是一个高精度的 深度 值。由于被存储在一张纹理中, 深度 纹理里的 深度 值范围是[0, 1],而且通常是非线性分布的。这些 深度 值来自于顶点变换后得到的归一化的设备坐标(NDC)。 回顾一下,一个模型要想最终被绘制在屏幕上,需要把它的顶点从模型空间变换到齐次裁剪坐标系下,这是通过在顶点着色器中乘以MVP变换矩阵得到的。在变换的最后一步,我们需要使用一个投影矩阵来变换顶点,当我们使用的是透视投影类型的摄像机时,这个投影矩阵就是非线性的,而正交投
Unity Shader 是一种编写 GPU 程序的语言,用来创建各种视觉效果,从简单的颜色变换到复杂的光照和阴影。通过编写 Shader ,可以在 Unity 中创建独特的材质、纹理、粒子效果和屏幕后处理效果等,从而实现更好的视觉效果。 Unity Shader 使用的是一种名为 Shader Lab 的语言,它是一个与 Unity 引擎紧密集成的高级着色器语言。 Shader Lab 可以用来定义 Shader 的输入和输出,以及设置 Shader 的属性和参数。同时, Shader Lab 还可以与其他编程语言(如 Cg/HLSL)配合使用,实现更复杂的效果。 在 Unity 中, Shader 的编写需要使用 Unity Shader Graph 或者手写代码两种方式。 Shader Graph 是一种基于节点的可视化编程工具,可以帮助开发者更轻松地创建各种效果,而手写代码则需要具备一定的编程基础和数学知识。无论使用哪种方式,都需要对 Shader 的输入、输出、属性和参数等有深入的理解。
int xmin, xmax, ymin, ymax; Carpet(){} Carpet(int a, int b, int g, int k)//用左下角坐标及横纵方向长度来初始化4个成员变量 xmin = a; ymin = b; xmax = a + g; ymax = b + k; bool contains(int x, int y)//地毯是否盖住(x,y)点 return x >= xmin && x <= xmax && y >= ymin && y <= ymax; }Carpet; int main() int n, a, b, g, k, x, y; Carpet carp[10005]; cin>>n; for(int i = 1; i <= n; ++i) cin>>a>>b>>g>>k; carp[i] = Carpet(a, b, g, k); cin>>x>>y; for(int i = n; i >= 1; --i)//从后向前遍历,找到的第一个包含x,y点的地毯就是这一点最上面的地毯 if(carp[i].contains(x, y))//若地毯i覆盖了点x,y cout<<i; return 0; cout<<-1;//若没有被地毯覆盖 return 0; Android上实现一个简单的天气预报APP(二) 配置布局 weixin_60841712: Android上实现一个简单的天气预报APP(二) 配置布局 qq_41482838: https://zhangqx.gitbooks.io/mini-weather/content/doc02_md.html 这个链接最后几个加载不出来了,能重新贴下嘛 OpenGL基于glfw库的画点、画线、画三角 liuwei200000: vcpkg install glew:x64-windows 代码加入头文件: #include <gl/glew.h>