Unity3D Shader 入门知识详解。

Unity3D Shader 入门知识

Shader(着色器)对很多 Unity 初学者来说像是“黑魔法”。

实际上,Shader 并没有那么神秘,它本质上就是一段运行在 GPU 上的小程序,用来控制 屏幕上每个像素的颜色和显示效果

本文会写一个最简单的 Shader,并逐步讲解 Shader 的基本结构。

什么是 Shader

在 Unity 中,Shader 是材质的核心,它告诉 GPU 如何去渲染一个物体。

我们平常看到的各种特效(发光、透明、水波、卡通描边)都是 Shader 在发挥作用。

Unity 的 Shader 常见有三类:

  • Surface Shader:Unity 封装的高层次写法,适合快速实现光照材质。
  • Vertex/Fragment Shader:底层控制方式,可以完全自定义顶点和像素的渲染。
  • Shader Graph:可视化编辑,拖拽节点即可拼接 Shader。

本文我们先用 最简单的 Unlit Shader(无光照)入门。

Shader 的基本结构

在 Unity 中,一个最基础的 Shader 结构长这样:

Shader "Custom/SimpleColor"
{Properties{_Color ("Main Color", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"fixed4 _Color;struct appdata{float4 vertex : POSITION;};struct v2f{float4 pos : SV_POSITION;};v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{return _Color;}ENDCG}}
}

代码解读

命名

Shader "Custom/SimpleColor"

每个 Shader 都需要一个唯一的名字,格式通常是 Shader "路径/名字"

这里并不是文件路径,而是 Unity 内部的命名空间

在材质球 (Material) 的 Shader 下拉菜单 里,这个名字会决定 Shader 的显示位置。

Properties 块

Properties
{_Color ("Main Color", Color) = (1,1,1,1)
}

这里定义了材质面板中可调的属性。

  • _Color:变量名(在 Shader 代码里使用)
  • "Main Color":在 Inspector 面板显示的名字
  • Color:属性类型
  • (1,1,1,1):默认值(RGBA = 白色)

SubShader 与 Pass

  • SubShader:真正的渲染逻辑写在这里。Unity 会根据显卡选择合适的 SubShader。
  • Pass:一次渲染指令。复杂 Shader 可能包含多个 Pass,比如一次渲染边缘,一次渲染本体。

Tags

Tags { "RenderType"="Opaque" }

它是一个 键值对 集合,用来告诉 Unity 的渲染管线,这个 Shader 应该被如何分类、排序和处理

"RenderType" 是 Unity 内置的一个 Shader Tag,用于描述 材质的大类渲染方式

常见取值有:

  • "Opaque"不透明物体(默认)
  • "Transparent"透明物体(如玻璃、粒子、UI)
  • "TransparentCutout"透明裁剪物体(如树叶、围栏,透明部分直接裁掉,没有半透明)

这里使用 "Opaque",Unity 会把它放到 不透明队列(Queue = Geometry, 2000 左右) 里进行渲染。

CGPROGRAM 块

这是 HLSL/CG 代码的区域,包裹在 CGPROGRAM 和 ENDCG 之间。

  • #pragma vertex vert:指定顶点着色器函数(vert)
  • #pragma fragment frag:指定片元着色器函数(frag)
  • #include "UnityCG.cginc":引入 Unity 提供的一个 HLSL 公共函数/宏库,相当于 C# 里的 using,例如下面用到的 UnityObjectToClipPos 就是这个库里的函数,把 模型空间 转换成 裁剪空间,几乎每个 Shader 顶点着色器都要用到。
fixed4 _Color;

在代码区域定义的 _Color 变量,使用的是 Properties 定义的 _Color 属性,名称要一致才能获取到。

顶点数据 appdata

struct appdata
{float4 vertex : POSITION;
};

appdata 是一个 输入结构体,表示从 CPU → GPU 传递过来的信息(网格顶点数据),是 GPU 渲染管线的入口数据

这里的 语义标识符: POSITION)告诉 GPU,vertex 对应的是顶点坐标。

Mesh 的每个顶点都会生成一个 appdata,送入顶点着色器。

顶点着色器 vert

struct v2f
{float4 pos : SV_POSITION;
};v2f vert (appdata v)
{v2f o;o.pos = UnityObjectToClipPos(v.vertex);return o;
}
  • 输入 appdata:包含了模型的顶点数据(位置、法线、UV 等)。
  • UnityObjectToClipPos:把模型空间的坐标转换到屏幕空间(必须操作)。
  • 输出 v2f:传递给片元着色器的数据(同 appdata,是一个结构体)。

片元着色器 frag

fixed4 frag (v2f i) : SV_Target
{return _Color;
}
  • frag 决定屏幕上这个像素最终是什么颜色。
  • 这里直接返回 _Color,所以整个模型就是一块纯色。

在 Unity 中测试

新建一个 Shader 文件,命名为 SimpleColor,粘贴上面的代码。

创建Shader

新建一个 材质(Material),把 Shader 设置为 Custom/SimpleColor

创建材质

设置Shader

创建一个 Cube,把材质拖到 Cube 上。

拖动材质

在 Inspector 面板调整 Main Color,模型就会变成对应的颜色。

调整颜色

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试之Redis篇】主从复制原理

从面试的角度来解释 Redis 主从复制原理,按照“总-分-总”的结构,清晰地阐述其核心概念、工作流程和关键要点,这能体现出你不仅知道是什么,还理解为什么以及如何应对相关问题。总览:一句话定义 面试官您好,…

数据库开启ssl

数据库:阿里云rds 系统:centos 需要修改的:nacos连接项目连接本地navicat连接 重点:为了兼容本地和服务器,ssl证书路径由原来的绝对路径换成环境变量参数,所以有步骤4 文章目录步骤1 阿里云步骤2 navicat…

Redis 事件驱动与多路复用源码剖析

Redis 事件驱动与多路复用源码剖析1. 前言 Redis 是 单线程 I/O 多路复用 的典型代表。 它并不是多线程处理请求,而是依赖 事件驱动(event-driven)模型,在一个线程内高效管理海量连接。 核心组件: ae.c:事…

VR煤矿实训系统相较于传统煤矿培训方式的独特优势​-广州华锐互动

高度逼真,沉浸体验​VR煤矿实训系统运用先进的3D建模、动态仿真技术,对煤矿井下的复杂环境进行1:1还原。从幽深的巷道、运转的采煤设备,到潮湿的空气、昏暗的灯光,甚至细微的煤尘颗粒,都能逼真呈现。使用者戴上VR设备后…

javaweb XML DOM4J

XMLXML作用就是配置文件,properties使用不了较复杂的需求,xml应运而生配置文件对比 xml更方便tips1:新建resources目录,并将src中的jdbc.properties移到resourcs中,并且右键标记为源代码根目录,这样运行src时就会和pro…

多模态视频理解领域 Benchmark 与 Leaderboard 整理

多模态视频理解是当前人工智能领域的研究热点,其核心目标是让模型像人类一样,综合视频中的视觉、听觉(部分场景)及文本信息,实现对视频内容的深度感知、理解与推理。为客观评估模型性能,行业内涌现了众多权…

18j621-3通风天窗图集pdf(免费高清版)

18j621-3通风天窗已经替代05j621-3通风天窗图集成为目前比较通用的建筑屋顶通风选型重要参考标准,18j621-3图集是对前图集的优化和革新,在18j621-3图集中新增了TC8圆拱型电动采光天窗,丰富了屋面通风排烟设备的选型。在18j621-3天窗图集中&am…

LawGPT:基于中文法律知识的大模型

本文转载自:https://www.hello123.com/lawgpt ** 一、⚖️ LawGPT:中文法律界的 “AI 法助”,啃透了 15 万份判决书! LawGPT 是一系列专攻中文法律知识的开源大模型,在通用中文基座(如 ChatGLM&#xff0…

用 go-commons 快速写一个监控 CPU/内存的 Exporter

欢迎加入开源项目,提你的 mr Go Commons:Golang 开发者的常用工具集,一站式解决常见需求 在 Go 语言的开发过程中,你是不是经常遇到这样的情况: 想要做点小功能,却得从零写起,或者到处找三方…

KingbaseES客户端工具Ksql使用全指南:从安装到高级操作

引言 在国产数据库蓬勃发展的今天,KingbaseES凭借其自主可控、高性能、高可用的特性,已成为政务、金融、能源等关键领域的首选数据库。而作为其配套的命令行工具,Ksql更是DBA和开发人员的“瑞士军刀”——它不仅能高效执行SQL查询&#xff0c…

【LeetCode - 每日1题】可以输入的最大单词数

🌈 个人主页:(时光煮雨) 🔥 高质量专栏:vulnhub靶机渗透测试 👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~) 🌵目录🌵 难度 ⭐⭐ 题目回顾 ✅解题思路 💖概述 💓核心…

3227. 字符串元音游戏

3227. 字符串元音游戏 题目链接:3227. 字符串元音游戏 代码如下: class Solution { public:bool doesAliceWin(string s) {return ranges::any_of(s, [](char c) {return c a || c e || c i || c o || c u;});} };

微信小程序坐标位置使用整理(四)map组件

一、地图上标点&#xff0c;marker 1.wxml <map id"map" scale"9" class"map"markers"{{markers}}" longitude"{{longitude}}" latitude"{{latitude}}" show-location"{{true}}"><cover-vie…

Parlant框架深度技术解析:革命性AI代理行为建模引擎

引言 在人工智能快速发展的今天&#xff0c;AI代理&#xff08;Agent&#xff09;技术已经成为连接人工智能与实际应用场景的重要桥梁。然而&#xff0c;传统的AI代理开发面临着诸多挑战&#xff1a;提示词工程的复杂性、行为不可预测性、工具调用的不确定性等问题严重制约了AI…

AI重构车载测试:从人工到智能的跨越

目录 一、AI 在车载测试中的核心价值 二、AI 在车载测试的具体应用场景 (一)自动驾驶测试:AI 解决 “场景覆盖” 与 “决策可靠性” 难题 (二)车机系统测试:AI 优化 “交互体验” 与 “功能稳定性” (三)车载硬件测试:AI 实现 “故障预测” 与 “精准校准” (四)功能…

从职责划分看架构:MVC 的 Controller 与 MVVM 的 ViewModel 差异

深入浅出&#xff1a;前端MVC与MVVM架构模式&#xff0c;你真的懂了吗&#xff1f;✨ 序言 各位前端的“程序猿”和“程序媛”们&#xff0c;大家好&#xff01;&#x1f44b; 在前端开发的江湖中&#xff0c;MVC和MVVM这两个词&#xff0c;就像武林秘籍一样&#xff0c;常常被…

Vue-color:Vue.js 专业颜色选择器组件库 – 支持Vue2/3,TypeScript,暗色主题

简介 Vue-color 是一个专为 Vue.js 设计的颜色选择器组件库&#xff0c;提供了多种风格的颜色选择器组件。它支持 Vue 2.7 和 Vue 3&#xff0c;具有 TypeScript 支持、SSR 兼容性和暗色主题支持。 特性 多种颜色选择器 – 提供 Chrome、Sketch、Photoshop 等多种风格Vue 2.…

ArcGIS定向影像(2)——非传统影像轻量级解决方案

ArcGIS能让用户自己低成本的做出谷歌街景吗&#xff1f;现在ArcGIS Pro 3.2 和 ArcGIS Enterprise 11.2 能够让用户不使用任何插件和扩展的情况下完成街景数据集的构建&#xff0c;数据管理&#xff0c;发布服务和调用的完整解决方案。非常体系化&#xff0c;由底层数据驱动&am…

CKA05--service

Task 重新配置 spline-reticulator namespace 中现有的 front-end Deployment&#xff0c;以公开现有容器 nginx 的端口 80/tcp 创建一个名为 front-end-svc 的新 Service &#xff0c;以公开容器端口 80/tcp 配置新的 Service &#xff0c;以通过 NodePort 公开各个 Pod 解析&…

用 Go 采集服务器资源指标:从原理到实践

在后端开发或运维工作中&#xff0c;采集服务器资源指标 是个绕不开的需求&#xff1a; 运维要看 CPU、内存、磁盘的使用情况监控系统要定期上报这些数据应用程序有时候也需要根据系统负载做限流、弹性伸缩 那么问题来了&#xff1a;用 Go 怎么优雅地采集这些指标呢&#xff…