当前位置: 首页 > news >正文

HDRP图形入门:HDRP渲染管线depth翻转

      新项目开坑HDRP渲染管线,花了些时间把项目开发框架和图形工作流更新到最新版本,其间发现HDRP中深度信息和buildin渲染管线翻转了。
      以前的buildin渲染管线,距离摄像机越近depth->0,越远depth->1,这也很好理解,离得越近距离越小,颜色值->(0,0,0,0)黑色,如下:
在这里插入图片描述
      而新HDRP中,深度如下:
在这里插入图片描述      可以看的出来是反过来的,也就是距离摄像机越近depth->1,越远depth->0。
      unity说是因为HDRP本身是为了支持高级图形硬件的图形语言比如hlsl设定的(比如dx和opengl的坐标系也是反的,同时uv也可能上下颠倒),当然这也不是什么大事,无非刚开始搞反了导致效果出问题,测试出来后改一改就好了。
在这里插入图片描述
      接下来根据新的规范实现一个遮挡剔除和不剔除的外发光特效,因为以前写过外发光特效的原理,所以这里从简,只叙述一下大纲:
      1.采样物体的轮廓纹理,进行纯色渲染。
      2.高斯滤波进行后处理得到轮廓像素外扩的纯色渲染。
      3.根据当前pixel片段所在的摄像机深度缓冲和物体轮廓纹理的深度相比较,如果片段轮廓纹理depth值更小,则代表距离摄像机更远,则被剔除渲染。

//滤波矩阵static float _GaussMatrix[9] = { 0.07511362, 0.1238414, 0.07511362, 0.1238414, 0.20418, 0.1238414, 0.07511362, 0.1238414, 0.07511362 };VaryingsEx VertBlur(AttributesEx input){VaryingsEx output;UNITY_SETUP_INSTANCE_ID(input);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);//必须采样屏幕坐标output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID);//采样uv坐标,用于纹理采样output.uv = GetFullScreenTriangleTexCoord(input.vertexID);float c = 1;for(int x=0;x<3;x++){for(int y=0;y<3;y++){   output.uvs[x*3+y] = (output.uv+_CustomColorTexture_TexelSize.xy*float2((y-c)*_BlurSpread,(x-c)*_BlurSpread));}}return output;}float4 FragBlur(VaryingsEx input) : SV_Target{UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);float4 col = float4(0,0,0,0);for(int k=0;k<9;k++){col+=(CustomPassSampleCustomColor(input.uvs[k])*_GaussMatrix[k]);}col*=_Brightness;//采样上一个custompass纹理//如果纹理有颜色数据,则剔除掉,就可以显示最底层的模型渲染纹理float4 ocol = CustomPassSampleCustomColor(input.uv);if(ocol.a>0){discard;}return col;}

      以上是进行高斯滤波和原始纹理裁剪得到轮廓外发光效果。

			void GetSurfaceAndBuiltinData(FragInputs fragInputs, float3 viewDirection, inout PositionInputs posInput, out SurfaceData surfaceData, out BuiltinData builtinData){float2 colorMapUv = TRANSFORM_TEX(fragInputs.texCoord0.xy, _ColorMap);float4 result = SAMPLE_TEXTURE2D(_ColorMap, s_trilinear_clamp_sampler, colorMapUv);//hdrp摄像机深度值由近到远1->0深度图采样near=1,far=0//通过像素坐标xy值采样深度信息float camdepth = LoadCameraDepth(fragInputs.positionSS.xy);//当前像素深度信息由近到远//1->0float vertexdepth = posInput.deviceDepth;if(_OcclutionDiscard == 1){//如果当前像素的深度值<深度图深度值//则表示当前像素距离摄像机更远//则被剔除渲染if(vertexdepth<camdepth){discard;}}// Write back the data to the output structuresZERO_BUILTIN_INITIALIZE(builtinData); // No call to InitBuiltinData as we don't have any lightingZERO_INITIALIZE(SurfaceData, surfaceData);builtinData.opacity = result.a;builtinData.emissiveColor = float3(0, 0, 0);surfaceData.color = camdepth;}

      以上是根据深度缓冲进行剔除和非剔除采样。

在这里插入图片描述
      可以看到添加物体外发光和选择遮挡剔除完成需要的效果。
      ps:因为现在更加倾向于自身健康和家庭生活,所以博客只会偶尔花最多半个小时对一些技术要点(或坑点)进行说明。

http://www.lryc.cn/news/227097.html

相关文章:

  • uniapp——项目02
  • Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信
  • gitlab-ce-12.3.5 挖矿病毒及解决方案
  • 每日一题(LeetCode)----数组--移除元素(四)
  • 421. 数组中两个数的最大异或值/字典树【leetcode】
  • C++(20):自定义类型实现基于范围的for循环
  • Linux常用命令:find、grep、vim、cat、less、more
  • Oracle导入,注意事项
  • 【数据结构】入队序列出队序列问题(以21年408真题举例)
  • 在ant构建脚本中调用maven的命令
  • 美格智能5G RedCap模组顺利完成中国联通5G物联网OPENLAB开放实验室认证
  • Git基础知识学习常用命令一
  • 【2023.11.6】OpenAI发布会——近期chatgpt被攻击,不能使用
  • 云原生 黑马Kubernetes教程(K8S教程)笔记——kubernetes介绍。Master集群控制节点、Node工作负载节点、Pod控制单元
  • [护网杯 2018]easy_tornado 1(两种解法!)
  • 冒泡排序(Bubble Sort)
  • JVM源码剖析之软、弱、虚引用的处理细节
  • Linux服务器上搭建JupyterNotebook教程
  • 记录bug1
  • 【MySQL】rank()、row_number()、dense_rank()用法详解
  • NFT合约部署
  • 【C++】从入门到精通第三弹——友元函数与静态类成员
  • acwing算法基础之搜索与图论--floyd算法
  • Zabbix监控SSL证书有效期
  • Arduino OneButton按键处理库实现单击/双击/长按功能
  • day52 django的下载与安装
  • WebGL智慧城市软件项目
  • VMware重装后没有虚拟网卡
  • 软件安全基础
  • 探索项目管理软件的多重用途和益处