【UnityShader自学日志】线框自发光着色器

2023-12-20 13:08

本文主要是介绍【UnityShader自学日志】线框自发光着色器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、新建一个无光照着色器(Unlit Shader),重命名为“Unlit_wire”

2、修改其代码如下

Shader "PACKT/unlit_wireframe1" {Properties{//线框着色器所需要的三个属性_Color("Color", Color) = (0,0,0,0) //模型的颜色_EdgeColor("Edge Color", Color) = (0,1,0,1) //线框的颜色_Width("Width", float) = 0.1 //线框的粗细}SubShader{//指定着色器以透明方式渲染Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }LOD 100//第一遍绘制背面Pass{//指定混合模式//混合模式,即产生新颜色的方式,可用下面公式来表达//新颜色 = 源颜色 * 源因数 + 目的颜色 * 目的因数//SrcAlpha和OneMinusSrcAlpha的含义为使用源颜色中的alpha通道值作为源因数,用1减去alpha通道值作为目的因数Blend SrcAlpha OneMinusSrcAlpha//渲染模型背面Cull Front//AlphaTest令着色器只渲染Alpha通道大于一定值的像素,而将小于该值的像素直接丢弃AlphaTest Greater 0.5 CGPROGRAM#pragma vertex vert  //顶点处理器函数vert#pragma fragment frag  //片元处理器函数fraguniform float4 _Color;uniform float4 _EdgeColor;uniform float _Width;//定义了顶点处理器的输入数据struct appdata{float4 vertex : POSITION; //顶点坐标float4 texcoord1 : TEXCOORD0; //贴图的纹理坐标float4 color : COLOR; //顶点颜色};//定义了由顶点处理器向片元处理器传送的数据struct v2f{float4 pos : POSITION;float4 texcoord1 : TEXCOORD0;float4 color : COLOR;};//顶点处理器代码//为模型的顶点计算正确的投影坐标,并且把顶点所对应的纹理坐标和颜色一起打包传送给片元处理器代码v2f vert(appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.texcoord1 = v.texcoord1;o.color = v.color;return o;}//片元处理器代码//最终为模型在画面中覆盖的像素计算颜色值fixed4 frag(v2f i) : COLOR{fixed4 answer;float lx = step(_Width, i.texcoord1.x);float ly = step(_Width, i.texcoord1.y);float hx = step(i.texcoord1.x, 1.0 - _Width);float hy = step(i.texcoord1.y, 1.0 - _Width);answer = lerp(_EdgeColor, _Color, lx*ly*hx*hy);return answer;}ENDCG}//第二遍绘制正面Pass{Blend SrcAlpha OneMinusSrcAlphaCull BackAlphaTest Greater 0.5CGPROGRAM#pragma vertex vert#pragma fragment fraguniform float4 _Color;uniform float4 _EdgeColor;uniform float _Width;struct appdata{float4 vertex : POSITION; float4 texcoord1 : TEXCOORD0; float4 color : COLOR; };struct v2f{float4 pos : POSITION;float4 texcoord1 : TEXCOORD0;float4 color : COLOR;};v2f vert(appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.texcoord1 = v.texcoord1;o.color = v.color;return o;}fixed4 frag(v2f i) : COLOR{fixed4 answer;float lx = step(_Width, i.texcoord1.x);float ly = step(_Width, i.texcoord1.y);float hx = step(i.texcoord1.x, 1.0 - _Width);float hy = step(i.texcoord1.y, 1.0 - _Width);answer = lerp(_EdgeColor, _Color, lx*ly*hx*hy);return answer;}ENDCG}}Fallback "Vertex Colored", 1
}

PS:对于透明渲染方式来说,必须先绘制距离摄像机较远的表面,后绘制较近的表面才能获得正确的透明结果。由于物体的背面一定比正面远,所以第一遍渲染必须先绘制背面。

PS Again:此着色器更加接近底层的硬件着色器,若想更加深入了解硬件着色器可查找“可编程图形管线”的相关知识。

 

这篇关于【UnityShader自学日志】线框自发光着色器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/516162

相关文章

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

JAVA Log 日志级别和使用配置示例

《JAVALog日志级别和使用配置示例》本文介绍了Java中主流的日志框架,包括Logback和Log4j2,并详细解释了日志级别及其使用场景,同时,还提供了配置示例和使用技巧,如正确的日志记录方... 目录一、主流日志框架1. Logback (推荐)2. Log4j23. SLF4J + Logback

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

tomcat日志中文乱码问题及解决方案

《tomcat日志中文乱码问题及解决方案》文章主要介绍了在使用Tomcat时遇到的乱码问题及其解决方法,页面输出乱码可能由于server.xml配置、HTML标签、编程输出编码不一致引起,解决方法包括... 目录一、页面输出乱码1.server.XML配置未注明编码格式2.catalina.bawww.cp

Mysql利用binlog日志恢复数据实战案例

《Mysql利用binlog日志恢复数据实战案例》在MySQL中使用二进制日志(binlog)恢复数据是一种常见的用于故障恢复或数据找回的方法,:本文主要介绍Mysql利用binlog日志恢复数据... 目录mysql binlog核心配置解析查看binlog日志核心配置项binlog核心配置说明查看当前所

Java 日志中 Marker 的使用示例详解

《Java日志中Marker的使用示例详解》Marker是SLF4J(以及Logback、Log4j2)提供的一个接口,它本质上是一个命名对象,你可以把它想象成一个可以附加到日志语句上的标签或戳... 目录什么是Marker?为什么使用Markejavascriptr?1. 精细化的过滤2. 触发特定操作3

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日