【URP】什么是[深度偏移](Slope Scale Depth Bias)
【从UnityURP开始探索游戏渲染】专栏-直达
深度偏移(Slope Scale Depth Bias)的作用
- 几何体表面因浮点精度限制导致的深度冲突(Z-fighting)
- 解决 Z-fighting 问题,调整片元深度值。
- 阴影贴图中的深度精度问题
- 透明物体渲染时的深度排序问题
- 细小几何体(如电线、毛发)的渲染稳定性
深度冲突(Z-fighting)
- 是当两个或多个几何表面在深度缓冲中具有极其接近的深度值时,GPU 无法可靠判断渲染顺序导致的视觉瑕疵,表现为表面像素闪烁或随机交替显示。这是由于透视投影下非线性深度分布及有限的深度缓冲精度(通常 24 位)所致,尤其远距离平面精度更差
- 深度偏移(Slope Scale Depth Bias)是图形渲染中用于解决深度冲突(Z-fighting)问题的重要技术。在Unity URP中,它通过调整像素的深度值来避免几何体表面之间的深度测试冲突.
深度偏移(Slope Scale Depth Bias)解决原理
通过动态调整顶点深度值,人为制造深度间隙避免冲突。其核心参数组合为:
Units
- 固定深度偏移量(常量),对所有表面施加相同偏移
Factor
基于表面斜率的动态偏移量(变量),计算公式为:
- 动态偏移量 = Factor × max(|∂z/∂x|, |∂z/∂y|)
- 倾斜表面(如斜坡、墙壁)斜率大,自动获得更大偏移
- 平坦表面偏移较小,避免过度分离
最终深度修正公式:
最终深度值 = 原始深度值 + (Units × 最小深度单位) + (动态偏移量)ZFightingFix.shader
Shader "URP/ZFightingFix" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Units ("Units", Float) = 0 // 固定偏移
_Factor ("Slope Factor", Float) = 0 // 坡度系数
}
SubShader {
Tags { "RenderPipeline"="UniversalPipeline" }
Pass {
HLSLPROGRAM
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes {
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
};
struct Varyings {
float4 positionCS : SV_POSITION;
}; float _Units, _Factor; Varyings vert(Attributes v) {
Varyings o;
// 转换到裁剪空间
o.positionCS = TransformObjectToHClip(v.positionOS.xyz); // 计算表面斜率(视图空间法线Z分量)
float3 normalVS = normalize(TransformWorldToViewDir(
TransformObjectToWorldNormal(v.normalOS)
));
float slope = abs(normalVS.z); // Z越小表面越陡峭 // 应用深度偏移
float bias = _Units * 0.0001 + _Factor * (1 - slope);
o.positionCS.z -= bias * o.positionCS.w; // 按w缩放适配透视
return o;
}
// ... 片元着色器省略
ENDHLSL
}
}
}
具体使用方法
关键参数说明
_DepthBias: 固定深度偏移量,正值使物体看起来更近_SlopeScale: 基于表面斜率的动态偏移量,解决陡峭表面的深度冲突output.positionCS.z += ...: 在裁剪空间直接修改深度值slope计算: 基于法线向量计算表面斜率
参数建议
- 对于阴影渲染,建议使用较小的
_DepthBias值(0.001-0.01) - 对于复杂地形,可增加
_SlopeScale值(0.1-1.0) - 在URP管线下,也可通过
Renderer组件的ShadowCastingMode设置全局深度偏移 - 法线贴图会影响实际斜率计算,需在切线空间正确转换法线向量
- DepthBiasExample.shader
Shader "Custom/DepthBiasExample"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DepthBias ("Depth Bias", Float) = 0
_SlopeScale ("Slope Scale", Float) = 0
} SubShader
{
Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" } Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
}; struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
}; CBUFFER_START(UnityPerMaterial)
float _DepthBias;
float _SlopeScale;
CBUFFER_END TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex); Varyings vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz); // 应用深度偏移
output.positionCS.z += _DepthBias * output.positionCS.w; // 基于斜率应用额外偏移
float3 normalVS = TransformWorldToViewDir(float3(0,1,0)); // 示例法线
float slope = 1.0 - abs(normalVS.z);
output.positionCS.z += _SlopeScale * slope * output.positionCS.w; output.uv = input.uv;
return output;
} half4 frag(Varyings input) : SV_Target
{
return SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
}
ENDHLSL
}
}
}
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)
【URP】什么是[深度偏移](Slope Scale Depth Bias)的更多相关文章
- Depth Bias 以及 Ogre材质中的depth_bias
深度偏移用来解决共面情况下出现闪烁的问题 通过给多边形增加一个z方向深度偏移(depth bias,z_bias),使3D空间的共面多边形看起来好像并不共面,以便它们能够被正确渲染.这种技术是很有用的 ...
- OpenGL(二十一) glPolygonOffset设置深度偏移解决z-fighting闪烁问题
开启深度测试后OpenGL就不会再去绘制模型被遮挡的部分,这样实现的显示画面更为真实,但是由于深度缓冲区精度的限制,对于深度相差非常小的情况(例如在同一平面上进行两次绘制),OpenGL就不能正确判定 ...
- Shadow Map 原理和改进 【转】
http://blog.csdn.net/ronintao/article/details/51649664 参考 1.Common Techniques to Improve Shadow Dept ...
- UE4材质初探
转自:http://www.unrealchina.net/portal.php?mod=view&aid=233 UE4的材质表面上看起来很简单,可是到了用的时候却总是没有办法实现好的效果. ...
- OpenGL基础渲染
客户端-服务器 客户端是存储在CPU存储器中的,并且在应用程序中执行(或者驱动程序),驱动程序将渲染命令和数据组合起来,发动到服务器执行.服务器和客户机在功能上是异步的,他们是各自独立的软件模块或者硬 ...
- OpenGL学习脚印:深度測试(depth testing)
写在前面 上一节我们使用AssImp载入了3d模型,效果已经令人激动了.可是绘制效率和场景真实感还存在不足,接下来我们还是要保持耐心,继续学习一些高级主题,等学完后面的高级主题,我们再次来改进我们载入 ...
- 深度学习之PyTorch实战(2)——神经网络模型搭建和参数优化
上一篇博客先搭建了基础环境,并熟悉了基础知识,本节基于此,再进行深一步的学习. 接下来看看如何基于PyTorch深度学习框架用简单快捷的方式搭建出复杂的神经网络模型,同时让模型参数的优化方法趋于高效. ...
- Unity Shader入门精要学习笔记 - 第13章 使用深度和法线纹理
线纹理的代码非常简单,但是我们有必要在这之前首先了解它们背后的实现原理. 深度纹理实际上就是一张渲染纹理,只不过它里面存储的像素值不是颜色值而是一个高精度的深度值.由于被存储在一张纹理中,深度纹理里的 ...
- Unity 深度冲突的解决方法
Dillon|2014-02-12 10:00|5899次浏览|Unity(280)0 3d游戏中当2个片元距离近裁减平面 w 落在同一个区间的时候,他们的深度是相等的. 最终你所看到的结果,就是下 ...
- P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior
1. 论文简介 论文题目:P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior Paper地址:paper Code ...
随机推荐
- 数栈产品预告丨您的指标管理平台——EasyIndex即将上线
一.写在前面 2016年,数栈开始正式投入研发,发展至今,已经拥有了:实时开发.离线开发.算法开发这些开发平台:数据资产.数据质量这些资产平台:以及数据服务.智能标签这些服务平台,这些不同类型的 ...
- 前端切页面 架构配置 node npm grunt grunt合并HTML必看
快速搭建前端开发环境 1.npm包依赖 { "name": "demo", "version": "1.0.0", &q ...
- Go协程简单学习
什么是协程? 协程类似于线程,但是比线程更加轻量.一个程序启动会占用一个进程 而一个进程可以拥有多个线程 ,一个线程可以拥有多个协程. 一个进程至少包含一个主线程,一个主线程可以有更多的子线程. 线程 ...
- apche服务器下无后缀文件配置浏览器访问自动下载
1.在配置最新的IOS app 微信授权登录时 SDK时,碰到一个问题.服务器端需要配置IOS唤起微信APP授权的通用链接地址. 2.关于通用链接 3. 必须将ios的配置文件放入网址根目录下的app ...
- Windows链接创建神器:一键生成符号链接与硬链接的智能批处理工具【NuGet】
[自用工具]NuGet 或各项目中共用部分目录或文件,利用DOS符号链接解决重复文件的多份拷贝,起到节省磁盘空间的作用. 告别复杂的命令行操作!这款增强版批处理脚本让Windows链接创建变得简单.直 ...
- CF576A Vasya and Petyas Game 题解
CF576A Vasya and Petya's Game 数论思维题. 根据唯一分解定理,可以知道,如果一个数的各个质因数的数量确定了,这个数也就确定了. 每次询问的中,如果 \(x\) 是 \(y ...
- 前端开发系列132-进阶篇之脚手架Yue-cli的实现01-commander模块
这是系列文章`前端脚手架实现`的第一篇,主要讲解脚手架工具中的核心模块命令行参数解析功能的实现,重点讲解 Node 模块 [commander]()的使用. 在前端开发中我们已经接触过各种各样的脚手架 ...
- Wordpress设置必须登录才能查看内容
参考文章地址 我是一个不会编程的小白,在网上查了好多篇的文章都没有实现这个功能.都是在改完php的代码后,网站就报废了.后来我还是求助了万能的谷歌,找了这篇文章. 上代码.大概猜测了一下,就是判断你现 ...
- sql 查找最晚入职员工信息
简介 order by 然后 limit select * from employees order by hire_date desc limit 1;
- opengl 学习 之 10 lesson
opengl 学习 之 10 lesson 简介 透明度 简单来说让设定的透明度起作用. link http://www.opengl-tutorial.org/uncategorized/2017/ ...