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

2023-11-10

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  //片元处理器函数frag

			uniform 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 OneMinusSrcAlpha
				Cull Back
				AlphaTest Greater 0.5

				CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

				uniform 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:此着色器更加接近底层的硬件着色器,若想更加深入了解硬件着色器可查找“可编程图形管线”的相关知识。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【UnityShader自学日志】线框自发光着色器 的相关文章

  • OpenGL 着色器。传递浮点数数组

    在我的场景中 我有许多物体想要同时旋转但角度不同 我有一个着色器 可以计算每个对象的位置并绘制整个场景 将顶点数组传递到带有顶点数组的着色器中 uniform float uRotation mat4 mz mat4 1 0 mz 0 0
  • 来自柏林噪声的每顶点法线?

    我正在 Opengl 几何着色器中生成地形 但在计算照明法线时遇到问题 我使用几何着色器中实现的柏林噪声函数动态生成每帧地形 因为这 我需要一种有效的方法来计算每个顶点的法线基于噪声函数 没有纹理或任何东西 我可以采用 2 条边的叉积来获取
  • 透明着色器允许下面的对象显示在上面

    在我的场景中 笑脸 带有 png 图像的四边形 放置在 Y 0 处 点 带有平铺 3X3 的四边形 放置在 Y 0 25 处 我需要用于笑脸的着色器是透明漫反射 因为我使用的是圆形 png 图像 但我在下面使用的点显示在笑脸上方 使用任何其
  • 优化重片段着色器的性能

    我需要帮助优化以下一组着色器 Vertex precision mediump float uniform vec2 rubyTextureSize attribute vec4 vPosition attribute vec2 a Tex
  • 在 Threejs 平面上渲染 TMX 地图

    使用新代码更新了问题 我正在尝试编写一个 WebGL 着色器来绘制TMX层 https github com bjorn tiled wiki TMX Map Format 从 Tiled 编辑器导出 我正在使用 THREE js 创建一个
  • 使用 python opengl (PyOpenGL) 创建几何着色器失败

    我想使用 glCreateShader GL GEOMETRY SHADER 创建 Geometry shader 但出现错误 Traceback most recent call last File test py line 9 in
  • 移动物体的漫射照明

    当计算移动物体的漫射照明时 我必须将光源与物体本身一起移动 Override public void draw draw frame Move object GLES20 glVertexAttribPointer aPositionLin
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 尝试制定一种算法,将图像附加到该主题

    我实际上正在尝试制作一种看起来像三次贝塞尔曲线的算法 但我想知道是否有更简单的解决方案 这就是我想要的 该图的长度为 1 高度为 1 红线是我的实际输入 黄点是给定的参数 我们可以称之为 扭曲 介于 0 和 1 之间 绿线就是我想要的结果
  • 我们可以在透明窗口上应用着色器吗

    I am looking to apply a particular shader to a transparent window for example on a live desktop I want to create a trans
  • 如何在 Unity 中创建一个可以显示由许多小图像组成的纹理的着色器

    所以我想做的是从 SQL 表加载卫星图像并将它们包裹在一个球体周围以创建一个地球仪 我知道我已经加载了所涵盖的图像 我只是不确定如何使我的着色器以正确的方向显示图像 我去了 Unity 论坛并查看了这段代码 https docs unity
  • OpenGL Phong 光照:镜面高光错误

    我的 OpenGL 中的 Phong 光照着色器似乎有一个奇怪的问题 镜面高光出现在对象的错误一侧 手头的问题 正如您所看到的 镜面高光出现在立方体的另一侧 从灯光的角度来看 也出现在立方体垂直边缘的角上 它应该只出现在最靠近灯光的一侧 立
  • 使用 texelFetch() 进行纹理化

    当我将非最大值传递到纹理缓冲区时 在渲染时它会绘制具有最大值颜色的几何图形 我在使用 glTexBuffer API 时发现了这个问题 例如 假设我的纹理数据是GLubyte 当我传递任何小于255的值时 那么颜色与用255绘制的颜色相同
  • GLSL 纹理立方体和纹理2D 在同一着色器中

    我似乎无法两者兼得texture2D and textureCube 在一个着色器中 当我这样做时 什么也没有显示 也没有错误 我用我自己的着色器加载器和 Apple GLSL 着色器生成器尝试了这一点 并且发生了同样的事情 即使我有也会发
  • 使用着色器创建模糊过滤器 - 从片段着色器访问相邻像素?

    我想使用 OpenGL ES 2 0 中的片段着色器创建模糊效果 我感兴趣的算法只是一个平均模糊 将所有相邻像素添加到我自己中并除以 9 进行标准化 但是我有两个问题 1 这是否需要我首先渲染到帧缓冲区 然后切换渲染目标 或者有更简单的方法
  • glUseProgram(0) 的作用是什么?

    OpenGL 文档为glUseProgram https www khronos org registry OpenGL Refpages gl4 html glUseProgram xhtml声称用参数调用它zero将导致着色器执行的结果
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • 如何使着色器淡入某种颜色?

    这是我当前使用的着色器 它通过缓慢降低不透明度来淡化对象 我想褪成紫色 如何才能做到这一点 着色器 frag uniform sampler2D texture uniform float opacity void main vec4 pi
  • Unity 后处理 PostProcessEffectRenderer 在编辑器中显示,但在构建中不显示

    将 PostProcessEffectRenderer 的实现添加到 Unity 后处理堆栈后 效果在 Unity 编辑器中完美运行 但不会在构建的游戏中显示 对构建质量的更改没有效果 使用针对 Windows x86 64 构建的最高质量

随机推荐

  • 【Python基础】在pandas中使用pipe()提升代码可读性

    1 简介 我们在利用pandas开展数据分析时 应尽量避免过于 碎片化 的组织代码 尤其是创建出过多不必要的 中间变量 既浪费了 内存 又带来了关于变量命名的麻烦 更不利于整体分析过程代码的可读性 因此以流水线方式组织代码非常有必要 图1
  • 打字侠:一款专业的中文打字网站

    打字侠第一个正式版发布啦 虽然离期望的样子还有一段路要走 不过能看到它正式发布 我还是很激动哟 打字侠是一款面向中学生和大学生的在线打字软件 它通过合理的课程设计和精美的图形界面帮助用户快速掌握盲打键盘的技巧 并提高打字效率 官方地址 he
  • sync/atomic - 原子操作

    sync atomic 原子操作 https github com polaris1119 The Golang Standard Library by Example blob master chapter16 16 02 md 对于并发
  • 23年新版 美团滑块 behavior _token

    逆向参数 behavior token Authencation f 一 behavior 加密位置 参数1 轨迹 参数2 request code 参数3 固定值 false 二 token 加密位置 参数1 固定值 false 参数2
  • P4355 [CERC2015] Kernel Knights

    P4355 CERC2015 Kernel Knights 题面翻译 骑术是一项中世纪的比赛 人们骑在马背上 在高速骑行时 试图用木制长矛互相攻击 总共有2n个骑士参加了一个激战锦标赛 来自两个主要竞争对手的N个骑士 到达后 每一个骑士都从
  • 基于Springboot+Vue社区志愿者管理平台

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 二、Json对象、Json数组和Json字符串

    一 Json字符串和Json对象定义 本文中的示例采用的是 fastjson 1 定义 JSON就是一串字符串 只不过元素会使用特定的符号标注 JSONObject是一个 包裹起来的一个对象 Object 双括号表示对象 JSONArray
  • 2023/09/12 qt&c++

    实现一个图形类 Shape 包含受保护成员属性 周长 面积 公共成员函数 特殊成员函数书写 定义一个圆形类 Circle 继承自图形类 包含私有属性 半径 公共成员函数 特殊成员函数 以及获取周长 获取面积函数 定义一个矩形类 Rect 继
  • How to Use Advanced Similarity Rules to view similar case suggestions

    How to Use Advanced Similarity Rules to view similar case suggestions
  • SIM800C二次开发(EAT开发)------------(4)APP代码UART浅析

    上篇文章中使用的uart做了APP试验 今天对其代码做一下简单的分析 上代码 解析 一 文件中的结构体 app代码中需要加入APP CFG段 begin pragma arm section rodata APP CFG APP ENTRY
  • Outlook-VBA-05-自动获取邮件附件

    系统 Windows 10 软件 Outlook 2016 本系列讲讲在Outlook中使用VBA实现一些功能 今天讲讲如何将特定人员 特定主题的邮件的附件存储到本地 Part 1 场景描述 工作中 希望另外一方定期给自己分发一些报告 在本
  • [Pyhon大数据分析] 五.人民网新闻话题抓取及Gephi构建主题知识图谱

    该系列文章是Python大数据分析系列博客 包括网络爬虫 可视化分析 GIS地图显示 情感分析 舆情分析 主题挖掘 威胁情报溯源 知识图谱 预测预警及AI和NLP应用等 希望该系列文章对您有所帮助 前文分享了采用SnowNLP对微博话题进行
  • pb 制作程序运行报错界面

    一 运行程序时报错提示 1 gt 在应该程式里的systemerror returns none 如下代码 if err sys 1 then err sys 0 return else open w system error end if
  • QMessageBox使用方法

    提示 关于更多pyqt5内容请关注 QMessage 前言 一 QMessageBox介绍 二 使用步骤 1 引入库 2 QMessageBox的枚举类型 3 QMessageBox的对话框展示 1 critical消息对话框 2quest
  • 在pytorch中使用Tensorboard

    tensorboard是一种模型可视化工具 可以帮助我们实时查看深度学习模型数据 但它本身是为tensorflow量身定做 无法直接用于pytorch等其他深度学习框架 在这种情况下 出了TensorboardX 可以辅助tensorboa
  • C语言——简单的程序设计

    目录 前言 一 顺序结构程序 1 顺序程序结构介绍 2 顺序程序举例 二 选择结构程序 1 选择结构程序介绍 2 if语句的三种形式 1 第一种形式的if语句 2 第二种形式的if语句 3 第三种形式的if语句 3 switch语句 三 循
  • ARP协议

    一 ARP概述 如果要在TCP IP协议栈中选择一个 最不安全的协议 那我会毫不犹豫把票投给ARP协议 我们经常听到的这些术语 包括 网络扫描 内网渗透 中间人拦截 局域网流控 流量欺骗 基本都跟ARP脱不了干系 大量的安全工具 例如大名鼎
  • 5.2 分布式 Git - 向一个项目贡献

    5 2 分布式 Git 向一个项目贡献 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 27 初稿 目录 文章目录 5 2 分布式 Git 向一个项目贡献 版本说明 目录 向一个项目贡献 1 提交准则 Figure 57
  • 【数模】数据统计与分析中的随机数

    matlab里关于随机数的用法 随机数 matlab里关于随机数的用法 一 简单随机数 1 rand 生成 0 1 区间上均匀分布的随机变量 2 randn 生成服从标准正态分布 均值为 0 方差为 1 的随机数 二 较复杂随机数 需安装了
  • 【UnityShader自学日志】线框自发光着色器

    1 新建一个无光照着色器 Unlit Shader 重命名为 Unlit wire 2 修改其代码如下 Shader PACKT unlit wireframe1 Properties 线框着色器所需要的三个属性 Color Color C