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

手把手教你抄写URP——2——透明材质

参考的主要还是URP的代码,这里誊抄的主要目的是熟悉SRP的编写过程,最后完成一套框架。

参考地址:https://gitee.com/yichichunshui/srpframework.git
版本号:b733bdadf9c53b97f133d46d035375cc24a630a5

本节是SRPFramework的第2节。
具体完成如下的任务:
1、实现透明物体的绘制

创建透明shader:

Shader "Unlit/Transparent"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "Queue"="Transparent" "LightMode"="SRPRenderPipeline"}
        LOD 100
		Blend SrcAlpha OneMinusSrcAlpha
		ZWrite Off

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
				return fixed4(1,1,0,0.5f);
            }
            ENDCG
        }
    }
}

注意这里的queue设置为transpant。而不是renderType=Transparent,这里我遇到一个坑。

创建透明材质:
在这里插入图片描述
这里如果选择是From Shader,则一定要设置好Queue=Transparent。

在forwardrender中增加一个m_transparentPass:

using System.Collections;
using System.Collections.Generic;
using SRP;
using UnityEngine;
using UnityEngine.Rendering;

public class ForwardRender : ScriptRenderBase
{
    public DrawObjectPass m_drawObjectPass;
    public DrawSkybox m_drawSkybox;
    public DrawObjectPass m_transparentPass;

    public ForwardRender()
    {
        m_drawObjectPass = new DrawObjectPass("Draw Opaque", SortingCriteria.CommonOpaque, RenderQueueRange.opaque);
        m_drawSkybox = new DrawSkybox();
        m_transparentPass = new DrawObjectPass("Draw Transparent", SortingCriteria.CommonTransparent, RenderQueueRange.transparent);
    }

    public override void Init(ScriptableRenderContext context, ref RenderData renderData)
    {
        AddPass(m_drawObjectPass);
        AddPass(m_drawSkybox);
        AddPass(m_transparentPass);
    }
}

重新写DrawObjectPass:

using System.Collections;
using System.Collections.Generic;
using SRP;
using UnityEngine;
using UnityEngine.Rendering;

public class DrawObjectPass : RenderPassBase
{
    private List<ShaderTagId> m_drawShaderIDs;
    private FilteringSettings m_filterSettings;
    private DrawingSettings m_drawSettings;
    private SortingCriteria m_sortingCriteria;
    private RenderQueueRange m_renderQueueRange;
    private ProfilingSampler m_profilingSampler;


    public DrawObjectPass(string profileTag, SortingCriteria sortingCriteria, RenderQueueRange renderQueueRange)
    {
        m_sortingCriteria = sortingCriteria;
        m_renderQueueRange = renderQueueRange;
        m_drawShaderIDs = new List<ShaderTagId>();
        m_drawShaderIDs.Add(new ShaderTagId("SRPRenderPipeline"));
        //m_drawShaderIDs.Add(new ShaderTagId("SRPDefaultUnlit"));
        LayerMask layerMask = -1;
        m_filterSettings = new FilteringSettings(m_renderQueueRange, layerMask);
        m_profilingSampler = new ProfilingSampler(profileTag);
    }

    public override void Execute(ScriptableRenderContext context, ref RenderData renderData)
    {
        SortingSettings sortingSettings = new SortingSettings(renderData.m_cameraData.m_camera) { criteria = m_sortingCriteria };
        m_drawSettings = new DrawingSettings(m_drawShaderIDs[0], sortingSettings);
        for (int i = 1; i < m_drawShaderIDs.Count; ++i)
        {
            m_drawSettings.SetShaderPassName(i, m_drawShaderIDs[i]);
        }
        context.DrawRenderers(renderData.m_cullingResults, ref m_drawSettings, ref m_filterSettings);
    }
}

framedebugger中情况如下:
在这里插入图片描述
效果为:
在这里插入图片描述
黄色的球为透明的,z深度关闭写,帧调试器中绘制顺序正确,效果混合正确。

相关文章:

  • 简单工厂(二)——coding
  • 手把手教你抄写URP——3——自发光材质
  • 抗癌中草药彩色图谱——西洋参
  • 防癌抗癌有着四步就足够了
  • mac java环境变量配置
  • 圣女贞德
  • 苏格拉底入职简历
  • 第一篇:个案管理师之概念篇-台湾最佳医院信息化及管理实践-
  • 释加牟尼生平简历
  • blendshapes
  • sqlite数据库简单操作
  • matlab基础
  • 安装vs 2005 sp1出现错误
  • 长长的回廊
  • 王安石传——任浩之著
  • 《深入 React 技术栈》
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Fundebug计费标准解释:事件数是如何定义的?
  • Github访问慢解决办法
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java,console输出实时的转向GUI textbox
  • STAR法则
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 程序员该如何有效的找工作?
  • 给第三方使用接口的 URL 签名实现
  • 聊聊flink的BlobWriter
  • 码农张的Bug人生 - 初来乍到
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 实现菜单下拉伸展折叠效果demo
  • 实现简单的正则表达式引擎
  • 使用parted解决大于2T的磁盘分区
  • 世界上最简单的无等待算法(getAndIncrement)
  • 小程序开发之路(一)
  • 小试R空间处理新库sf
  • 学习使用ExpressJS 4.0中的新Router
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (LeetCode) T14. Longest Common Prefix
  • (Oracle)SQL优化技巧(一):分页查询
  • (二)JAVA使用POI操作excel
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (转)ORM
  • (转)Sublime Text3配置Lua运行环境
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .htaccess配置常用技巧
  • .libPaths()设置包加载目录
  • .Net 8.0 新的变化
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Framework 4.6.2改进了WPF和安全性