Unity | Shader基础知识(第二十二集:两次渲染)

news2024/11/26 2:42:37

目录

一、前言

二、“渲染两次”

三、本次成品介绍

四、第一次渲染代码

五、第二次渲染代码 

六、截止目前的所有代码

七、调整代码

八、总结 


一、前言

之前一直讲的shader文件中,都只写了一次CG代码。

为了大家对这部分的整体理解,我们这次渲染两次。

二、“渲染两次”

这个词是我造的~不是定义。

什么叫渲染两次?

渲染就是画画的意思,渲染两次就是画两次。这里用画画举例。

第一次画画。(如图1所示)

图1 第一次画画

这里如果用文字描述一下,就是画了一个绿色的三角形。


第二次画画。(如图2所示)

 

图2 第二次画画

 如果用语言形容就是,在中间画了一个橘黄色的圆形。


所以我们一套结构CG结构就是画了一幅画。(如图3所示)

不用太在意具体写的什么代码,主要注意一些标志

CGPROGRAM前面是一些准备工作,像之前的模版写入,深度写入之类的。

ENDCG就是结束了绘制

中间就是一些绘制过程,引入一些材料。

这个全过程就是一次画画的全过程。

图3 一套流程

 

 渲染两次的意思是,我可以在一个shader文件中写两套这个东西。

三、本次成品介绍

我们这次先画一个模型的黑影,但是这个黑影要比模型本身大一点。这个做法参考上节课的代码。

Unity | Shader基础知识(第二十一集:应用-怪兽膨胀、顶点着色器和表面着色器合并)_unity 顶点膨胀shader-CSDN博客

然后再正常把模型渲染上去,就可以给模型做一个阴影或者说边框。(如图4所示)

图4 成品

 

四、第一次渲染代码

我们第一次先画一个模型的黑影(如图4所示),

备注:模型还是用上节课的模型。代码还是用的上节课的思路。

图4 我是谁?带刺小盆栽~
 Properties
 {
    //模型的贴图
    _MainTex ("Texture", 2D) = "white" {}

    //边框的大小(膨胀的大了,边框就大,反之就小)
     _Outline ("Outline Width", Range(0.002,0.1)) = 0.005

    //边框的颜色,我们要做黑影,所以就先来个黑色
     _OutlineColor ("Outline Color", Color) = (0,0,0,1)
 }

 SubShader
 {

     CGPROGRAM
     //引用,同上一集
     #pragma surface surf Lambert vertex:vert
    
    //承接上面素材,略
     sampler2D _MainTex;
     float4 _OutlineColor;
     float _Outline;

     void vert(inout appdata_full v)
     {
        //让原本的顶点在法线的方向上增加一点位置,
          这样影子就会变大
        v.vertex.xyz += v.normal * _Outline;
     }
        
    //其实目前代码里都没用到,但因为用了表面着色器,必须写
     struct Input
     {
         float2 uv_MainTex;
     };


     void surf(Input IN,inout SurfaceOutput o)
     {
        //我们把颜色直接给到自发光
        //备注:这里给到贴图也是可以的,但自发光要更亮一点,可以自己试
         o.Emission = _OutlineColor.rgb;
     }

     ENDCG
     }

这样我们第一次渲染就画好了。

五、第二次渲染代码 

到了ENDCG以后,就是这次画已经画完了,接下来我们再画模型真正的样子。

第二次不需要膨胀,所以顶点那部分就不用加了,直接把颜色上上去。这部分讲太多遍了,就不详解了。

 CGPROGRAM
 #pragma surface surf Lambert 
 struct Input{
     float2 uv_MainTex;
 };

 sampler2D _MainTex;

 void surf(Input IN, inout SurfaceOutput o)
 {
     o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
 }
 ENDCG
 }

六、截止目前的所有代码

Shader "Unlit/019"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        
        _Outline ("Outline Width", Range(0.002,0.1)) = 0.005
        _OutlineColor ("Outline Color", Color) = (0,0,0,1)
    }

    SubShader
    {
        //第一套渲染-------------------------------------
        CGPROGRAM
        #pragma surface surf Lambert vertex:vert
        struct Input
        {
            float2 uv_MainTex;
        };

        sampler2D _MainTex;
        float4 _OutlineColor;
        float _Outline;

        void vert(inout appdata_full v)
        {
           v.vertex.xyz += v.normal * _Outline;
        }


        void surf(Input IN,inout SurfaceOutput o)
        {
            o.Emission = _OutlineColor.rgb;
        }

        ENDCG

        //第二套渲染--------------------------------------

        CGPROGRAM
        #pragma surface surf Lambert 
        struct Input{
            float2 uv_MainTex;
        };

        sampler2D _MainTex;

        void surf(Input IN, inout SurfaceOutput o)
        {
            o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
        }
        ENDCG
        }
}

到这里我只是想证明给你们,渲染可以在后面加的,并不是只能写在那一个里面。

七、调整代码

到现在为止,我们渲染出来的结果。(如图5所示)

图5 结果

这并不是我们想要的样子,为什么会都是黑色,因为黑色部分是膨胀的,比彩色的大,所以被藏在里面了。(如图6所示)你可以通过增加膨胀的系数在缝隙里面看见。

图6 缝隙

解决方案:把深度写入关掉。

不管是你在外面还是里面,都画出来。

代码如下。(如图7所示)

图7 深度写入

到这里一步我们就可以得到(如图8所示) 

图8 结果

但是下一步的麻烦就是,我把模型背面也渲染出来了。

解决方案:在渲染黑色自发光时,关掉深度写入,在渲染模型时(第二次画画时),打开深度写入。(如图9所示)

 

这样我们就可以得到我们想要的结果了。

八、总结 

本节想表达的重点:

1.渲染可以写好几次

2.每次渲染之前,可以去调节后面渲染的一些方式。本次案例用深度写入为例子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务的保护

一、雪崩问题及解决方案 1.雪崩问题 微服务之间,一个微服务依赖多个其他的微服务。当一个微服务A依赖的一个微服务B出错时,微服务A会被阻塞,但其他不依赖于B的微服务不会受影响。 当有多个微服务依赖于B时,服务器支持的线程和并…

使用策略模式代替多个ifelse

传统的多个 public class OrderServiceImpl implements IOrderService {Overridepublic String handle(OrderDTO dto) {String type dto.getType();if ("1".equals(type)) {return "处理普通订单";} else if ("2".equals(type)) {return "…

PMP–知识卡片--产品管理知识体系

产品管理是公司为管理一个产品或者产品线的产品计划、产品市场和产品生命周期所采用的组织架构。产品管理是一个典型的强矩阵的管理方式。产品管理是企业或组织在产品生命周期中对产品规划、开发、生产、营销、销售和支持等环节进行管理的业务活动。 项目经理和产品有着直接、间…

xmind 2024下载,安装目录更改为其他盘

下载 最新版官网地址 更改目录

网络编程Day9_IO多路复用 20240821

运行1个服务器和2个客户端实现效果: 服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接,2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视服务器是否发来消息以及客户端自…

Go小技巧易错点100例(十七)

Go定时任务 在Go语言中,定时任务(也称为定时器或cron作业)具有多种作用,这些作用在应用程序的开发和运维中非常有用。以下是一些常见使用场景: 任务调度:定时任务可以在特定的时间点执行特定的任务&#…

云渲染服务大揭秘:为何它值得成为你的渲染新选择

云渲染是一种基于云计算的服务,它利用大量高性能计算机组成的集群来渲染高质量的图像和动画。这种服务能够显著加快3D动画或视觉效果项目的渲染速度,将原本可能需要数天的渲染任务缩短至数小时。 云渲染的优势 本文将探讨使用云渲染的好处,并…

【ACM出版,高录用EI快检索】第七届计算机信息科学与人工智能国际学术会议(CISAI 2024,9月6-8)

第七届计算机信息科学与人工智能国际学术会议(CISAI 2024) 将于2024年09月6-8日在中国浙江-绍兴举行。 计算机信息科学与人工智能国际学术会议的主题主要围绕“信息科学”与“人工智能”的最新研究展开,旨在荟聚世界各地该领域的专家、学者、研究人员及相关从业人员…

React学习笔记,从入门到砸门

项目构建命令 npx create-react-app react-basic npx:node语法 create-react-app:项目模板 react-basic:项目名称 项目结构 项目打包和本地预览 项目打包npm run build本地预览(模拟服务器运行项目) 安装本地服务包…

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3)

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3) 简介 实验 3:在搭建好 tcp 服务器,并拟定好协议的前提下,接收每一个 bin 文件的块,配置到 fpga。 原理图 fpga fpga1 stm32 接线总结 // fpga引脚 stm32…

快速了解矿用电源特性及其性能测试利器电源ate检测系统

在矿产资源开采的每一个环节,矿用电源都扮演着幕后英雄的角色,它的作用不可小觑。那么什么是矿用电源呢?电源ate检测系统如何助力矿用电源性能测试呢? 矿用电源模块介绍 矿用电源是专门用于矿井等地下作业场所的重要电源设备&…

阿里MAXCOMPUTE数据专辑信息读取并同步数据表

阿里MAXCOMPUTE数据专辑信息读取并同步数据表 在阿里云大数据体系中,我们可以使用数据地图的数据专辑,对数据的类别等进行一个管理 那么管理后的数据,我们想要落表进行相关的数据分析,如何做呢? 查看阿里云官方文档…

虚幻5|制作刀光粒子效果

一,创建一个粒子效果 1.Niagara系统 2.右键添加发射器,创建一个空白 3.点击空白的渲染,选择条带渲染器 4.右侧选择自定义侧面矢量 5.按顺序如下,编辑刀光的周期和方向 6.添加一个spawn per frame,使刀光每帧都在生成&…

Upload-Lab第13关:POST上传方式如何巧妙利用%00截断法绕过上传验证

第13关概述 在Upload-Lab第13关中,服务器会对上传的文件进行严格的扩展名检查。只有符合白名单的扩展名(如.jpg、.png等)才能成功上传。我们的目标是绕过这种检查,将恶意文件(如.php)上传到服务器。以下是…

图神经网络教程4-卷积图神经网络

介绍 卷积神经网络在涉及图像的预测任务上取得了最先进的性能。通过将权值学习核与输入图像卷积,CNN根据其视觉外观提取感兴趣的特征,无论它们在图像中的位置是哪里。虽然图像只是图的一个特殊情况(见图1 (a)),但是为图领域定义一个广义卷积…

了解同步带选择同步带

同步带和轮选型 同步带传动属于皮带传动,但是改进了传统皮带传动无法保持严格的传动比的打滑问题,传统皮带传动依靠皮带和皮带轮张紧时产生的摩擦力传输动力,但是从动轮遇到障碍或超载荷时,皮带会在皮带轮产生滑动。 解决打滑问题…

企业高性能web服务器【Nginx详解】

一.Web 服务基础介绍 1.1 互联网发展历程 1993年3月2日,中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实 验室的64K专线正式开通,成为我国连入Internet的第一根专线。 1995年马云开始创业并推出了一个web网站 中国黄页…

【其它-高效处理小技巧】如何批量备份263企业邮箱邮件

如何批量备份263企业邮箱邮件 近期由于有人离职,邮箱要注销,之前邮箱内有5000多封沟通邮件,为避免将来找不到沟通过程,所以需要备份。 目的:一次性备份所有沟通邮件 方法一: 少于20封邮件,推荐…

基于vue框架的爱心公益网站532y9(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,志愿者,公益资讯,捐赠物资,公益项目,项目报名,公益类型 开题报告内容 基于Vue框架的爱心公益网站 开题报告 一、项目背景与意义 在快速发展的现代社会中,公益事业作为社会文明进步的重要标志,越来越受到…

创建GPTs,打造你的专属AI聊天机器人

在2023年11月的「OpenAI Devday」大会上,OpenAI再度带来了一系列令人瞩目的新功能,其中ChatGPT方面的突破尤为引人关注。而GPTs的亮相,不仅标志着个性化AI时代的到来,更为开发者和普通用户提供了前所未有的便利。接下来&#xff0…