【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

相关文章

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.正常日志 和错误日

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

nginx配置错误日志的实现步骤

《nginx配置错误日志的实现步骤》配置nginx代理过程中,如果出现错误,需要看日志,可以把nginx日志配置出来,以便快速定位日志问题,下面就来介绍一下nginx配置错误日志的实现步骤,感兴趣的可... 目录前言nginx配置错误日志总结前言在配置nginx代理过程中,如果出现错误,需要看日志,可以把

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用