Unity3d Shader篇(一)— 顶点漫反射着色器解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、顶点漫反射着色器是什么?
    • 1. 顶点漫反射着色器的工作原理
  • 二、编写顶点漫反射着色器
    • 1. 定义属性
    • 2. 创建 SubShader
    • 3. 编写着色器程序段
    • 4. 完成顶点着色器
    • 5. 完成片段着色器
  • 三、效果
  • 四、总结


前言

在 Unity 中,Shader 可以用来实现各种视觉效果。本教程将详细介绍如何编写一个基于顶点漫反射的着色器,使物体的颜色根据光照和法线方向的变化而变化。


一、顶点漫反射着色器是什么?

顶点漫反射着色器是一种用于在渲染过程中模拟光照效果的着色器。与传统的基于像素的漫反射着色器不同,顶点漫反射着色器是在顶点级别计算光照效果,并将结果传递到片段着色器进行渲染。

1. 顶点漫反射着色器的工作原理

顶点着色器计算光照效果:在顶点着色器中,每个顶点的光照效果通过计算顶点的位置、法线和光源方向等信息来确定。通常,漫反射光照的计算涉及将光源的方向与表面法线的方向进行点乘运算,以确定光照对表面的影响程度。

传递光照结果到片段着色器:计算得到的光照效果(通常是颜色或灰度值)会被传递到片段着色器,以便在片段级别进行渲染。在片段着色器中,这些颜色信息会被用来着色物体的每个片段(像素),从而形成最终的图像。

二、编写顶点漫反射着色器

1. 定义属性

首先,我们需要定义 Shader 中的属性。在这个示例中,我们将包含一个用于控制物体漫反射颜色的属性。

Properties
{_Diffuse("Diffuse", Color) = (1, 1, 1, 1) // 漫反射颜色属性,默认白色
}

2. 创建 SubShader

SubShader 是 Shader 的一个主要部分,它包含了定义物体外观的具体逻辑。在这个示例中,我们将创建一个只有一个 Pass 的 SubShader。

SubShader
{Tags{"RenderType" = "Opaque" // 渲染类型为不透明}LOD 100 // 细节级别// 渲染通道Pass{// 着色器程序段}
}

3. 编写着色器程序段

着色器程序段包含了顶点着色器和片段着色器的具体实现。这些着色器控制了顶点和像素的渲染过程。

CGPROGRAM
#pragma vertex vert
#pragma fragment frag#include "UnityCG.cginc"
#include "Lighting.cginc"fixed4 _Diffuse;struct v2f
{float4 vertex : SV_POSITION; // 顶点位置fixed3 color : COLOR; // 颜色
};v2f vert(appdata_base v)
{// 顶点着色器逻辑
}fixed4 frag(v2f i) : SV_Target
{// 片段着色器逻辑
}
ENDCG

4. 完成顶点着色器

顶点着色器负责将物体的顶点位置从对象空间转换到裁剪空间,并执行必要的光照计算。

v2f vert(appdata_base v)
{v2f o;o.vertex = UnityObjectToClipPos(v.vertex); // 顶点位置变换到裁剪空间fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); // 世界空间法线fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); // 光源位置fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLight)); // 漫反射颜色计算o.color = diffuse; // 输出颜色return o;
}

5. 完成片段着色器

片段着色器不需要做太多的计算,只需将顶点着色器传递过来的颜色直接输出即可。

fixed4 frag(v2f i) : SV_Target
{return fixed4(i.color, 1); // 输出颜色
}

三、效果

左:顶点漫反射,右:常规材质
在这里插入图片描述

四、总结

通过以上步骤,我们成功创建了一个基于顶点漫反射的着色器。这个着色器会根据光照和法线的方向变化而改变物体的颜色。你可以根据自己的需求修改着色器代码,实现更复杂的效果。

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

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

相关文章

《Pandas 简易速速上手小册》第5章:Pandas 数据合并与重塑(2024 最新版)

文章目录 5.1 数据合并:Concatenate 和 Merge5.1.1 基础知识5.1.2 重点案例:客户订单数据合并5.1.3 拓展案例一:产品目录和销售数据合并5.1.4 拓展案例二:员工信息和部门数据合并 5.2 数据透视和重塑5.2.1 基础知识5.2.2 重点案例…

如何使用Cloudreve搭建私有云盘并发布公网访问无需购买域名服务器

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局&#…

路由重定向和别名

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 路由重定向实例场景:路由重定向的应用场景: 2. 路由别名实例场景:路由别名的应用场景: ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&…

备战蓝桥杯---数据结构与STL应用(进阶2)

本文将主要围绕有关map的今典应用展开&#xff1a; 下面我用图进行分析&#xff1a; 下面为AC代码&#xff1a; #include<bits/stdc.h> using namespace std; struct Point {int x,y;bool operator < (const Point & r) const {return x < r.x || ( x r.x &a…

Windows IIS服务如何配置并制作web站点结合内网穿透实现公网访问

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功总结&#xff1a; 自己用Windows Server搭建了家用NAS主机&…

【网络】:网络套接字(TCP)

网络套接字&#xff08;TCP&#xff09; 一.编写TCP服务器二.编写Tcp客户端三.多进程四.多线程版本五.线程池版完整源代码六.使用示例 一.编写TCP服务器 1.先搭一个架子 2.创建sockfd domain参数依然是AF_INET(因为是IPV4) type方式选择SOCK_STREAM&#xff08;提供可靠的连接…

从零开始学Linux之chkconfig命令

首先我们要知道Linux系统有以下7种运行级别&#xff0c;分别用0到6数字表示&#xff0c;这里使用红帽6系统做演示 0&#xff1a;关机 1&#xff1a;单用户模式&#xff0c;root用户免密登录&#xff0c;用于系统维护&#xff0c;例如忘记用户密码可以切换到该模式直接使用roo…

查看本地mysql的密码

1.导出链接 在数据库连接工具找到导出链接 导出到桌面即可&#xff0c;注意导出密码 2.复制密码 3.解密 复制如下代码到网址&#xff1a;代码在线运行 - 在线工具 (tool.lu) <?php namespace FatSmallTools; class NavicatPassword {protected $version 0;protected $a…

YOLOv5算法进阶改进(14)— 即插即用的动态卷积之ODConv | 助力涨点

​ 前言:Hello大家好,我是小哥谈。动态卷积(Dynamic Convolution)是一种用于目标检测的卷积神经网络模块,其中ODConv(Object Detection Convolution)是其一种具体实现。动态卷积在传统的卷积操作上引入了动态权重,以适应不同目标的形状和尺度变化。本文将YOLOv5的主干网…

Python实战:使用DrissionPage库爬取拉勾网职位信息

DrissionPage库&#xff0c;号称可以把Selenium按在地上摩擦&#xff01; 常规情况下&#xff0c;我们借助 requests 库爬取不加密的网站&#xff0c;使用 Selenium 库爬取加密的网站。 requests 效率高&#xff0c;但是解密难度大。Selenium 库可以实现网页自动化&#xff0c…

【星海随笔】RYU控制器(一)

Ryu is a component-based software defined networking framework.   Ryu是一个基于组件的软件定义网络框架 Ryu supports various protocols for managing network devices, such as OpenFlow, Netconf, OF-config, etc.   支持管理网络设备的多种协议 About OpenFlow, R…

Redis 布隆过滤器

布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…

视频融合平台EasyCVR推流成功但平台显示不在线是什么原因?

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

环形链表找入环点----链表OJ---三指针

https://leetcode.cn/problems/linked-list-cycle-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 首先&#xff0c;需要判断是否有环&#xff0c;而这里我们不单纯判断是否有环&#xff0c;还要为下一步做准备&#xff0c;需要让slow指针和fast都从头结点开始…

使用pygame建立一个简单的使用键盘方向键移动的方块小游戏

import pygame import sys# 初始化pygame pygame.init()# 设置窗口大小 screen_size (640, 480) # 创建窗口 screen pygame.display.set_mode(screen_size) # 设置窗口标题 pygame.display.set_caption("使用键盘方向键移动的方块的简单小游戏")# 设置颜色 bg_colo…

MQ回顾之rabbitmq速通

rabbitMQ相对来说功能比较完善&#xff0c;吞吐量会低一点。 持续更新…… 安装 docker 测试选择docker安装 官方安装操作 1、docker pull rabbitmq:latest 2、docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq 3、docker…

transformer_正余弦位置编码代码笔记

transformer_正余弦位置编码代码笔记 transformer输入的序列中&#xff0c;不同位置的相同词汇可能会表达不同的含义&#xff0c;通过考虑位置信息的不同来区分序列中不同位置的相同词汇。 位置编码有多种方式&#xff0c;此处仅记录正余弦位置编码 正余弦位置编码公式如下&…

idea+javafx的真正打包方式

概述&#xff1a;看到网上很多乱说javafx如何打包的&#xff0c;这里写一篇真正可以打包javafx的。 注&#xff1a;使用java17即使里面没有javafx&#xff0c;也是可以运行javafx项目的&#xff0c;只要你们按照下面一步一步来即可。 第一步&#xff1a;编写一个类去调用主类…

ArXiv| Graph-Toolformer: 基于ChatGPT增强提示以赋予大语言模型图数据推理能力

ArXiv| Graph-Toolformer: 基于ChatGPT增强提示以赋予大语言模型图数据推理能力. 来自加利福利亚大学戴维斯分校计算机科学系的IFM实验室发表在arXiv上的文章:“Graph-ToolFormer: To Empower LLMs with Graph Reasoning Ability via Prompt Augmented by ChatGPT”。 文章的…

2.1总结

还是一样水更一天&#xff0c;就随便做了几个题&#xff0c;有一个周期有点长&#xff0c;后面更一篇长的 随手刷的一道水题&#xff0c;就不往今天的行程单添了 问题&#xff1a;最大公约数 题解&#xff1a;题目太水了&#xff0c;就是求三个数&#xff0c;其中两组的最大公…