URP - 简单光照

news/2025/1/7 23:07:46/文章来源:https://www.cnblogs.com/sailJs/p/18604999

要点

  • 这边只涉及光源的漫反射和高光。
  • 漫反射(Diffuse)使用了Lambert方法来计算,高光(Specular)使用了Blin-Phone方法来计算,参考:Shader入门精要笔记 - CH6_最简单的逐像素Blinn-Phong光照

 

公式中的相关变量的获取

1) 顶点法线方向

  VertexNormalInputs normalInputs = GetVertexNormalInputs(IN.normalOS.xyz);
  OUT.normalWS = normalInputs.normalWS;

 2) 光线方向

  Light light = GetMainLight();
  float3 lightDirWS = light.direction;

 3) 视角方向

  VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz);
  OUT.viewDirWS = GetCameraPositionWS() - positionInputs.positionWS;

 

Shader "My/URP_SimpleLit" {Properties {_BaseMap("Texture", 2D) = "white" {} //主贴图_BaseColor("Tint Color", Color) = (1, 1, 1, 1) //混合颜色
_Specular("Specular", Color) = (1, 1, 1, 1) //高光反射颜色_Gloss("Gloss", Range(8.0, 256)) = 20 //高光区域大小
    }SubShader {Tags {"RenderPipeline" = "UniversalPipeline" //用于URP的shader"Queue" = "Geometry" //URP中不再决定渲染顺序(以前是序号越小越先渲染), 而仅仅是一个类别id"RenderType" = "Opaque"}HLSLINCLUDE#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"//所有属性都要缓存到CBuffer中, 这样才能兼容SRP Batcher
        CBUFFER_START(UnityPerMaterial)float4 _BaseMap_ST;float4 _BaseColor;float4 _Specular;float _Gloss;CBUFFER_ENDENDHLSLPass {Tags { "LightMode" = "UniversalForward" } //该pass为渲染pass
HLSLPROGRAM#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"#pragma vertex vert //指定顶点着色器函数#pragma fragment frag //指定片元着色器函数struct Attributes { //程序传入顶点着色器的数据float4 positionOS : POSITION; //用模型空间顶点坐标填充该变量float4 normalOS : NORMAL; //用模型空间法线方向填充该变量float2 uv : TEXCOORD0; //用模型的第一套纹理坐标(uv)填充该变量
            };struct Varings { //顶点着色器传入片元着色器的数据float4 positionCS : SV_POSITION; //该变量存放了裁剪空间的顶点坐标
                float2 uv : TEXCOORD0;float3 positionWS : TEXCOORD1;float3 viewDirWS : TEXCOORD2;float3 normalWS : TEXCOORD3;};//变量
            TEXTURE2D(_BaseMap);SAMPLER(sampler_BaseMap);Varings vert(Attributes IN) { //顶点着色器
                Varings OUT;VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz); //顶点坐标从模型空间转其他空间OUT.positionCS = positionInputs.positionCS;OUT.positionWS = positionInputs.positionWS;OUT.viewDirWS = GetCameraPositionWS() - positionInputs.positionWS; //视角方向
VertexNormalInputs normalInputs = GetVertexNormalInputs(IN.normalOS.xyz);OUT.normalWS = normalize(normalInputs.normalWS); //法线方向
OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap); //应用贴图的tiling和offsetreturn OUT;}float4 frag(Varings IN) : SV_Target { //片元着色器(逐像素)//计算主光(逐像素)Light light = GetMainLight();float3 lightDirWS = light.direction;half3 diffuse = LightingLambert(light.color, lightDirWS, IN.normalWS); //lambert方法计算漫反射比例half3 specular = LightingSpecular(light.color, lightDirWS, normalize(IN.normalWS), normalize(IN.viewDirWS), _Specular, _Gloss); //Blinn-Phong方法计算高光//计算附加光照(逐像素)uint pixelLightCount = GetAdditionalLightsCount();for (uint lightIndex = 0; lightIndex < pixelLightCount; ++lightIndex) {Light light = GetAdditionalLight(lightIndex, IN.positionWS);//叠加附加光照diffuse += LightingLambert(light.color, light.direction, IN.normalWS);specular += LightingSpecular(light.color, light.direction, normalize(IN.normalWS), normalize(IN.viewDirWS), _Specular, _Gloss);}half4 texColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv); //根据纹理坐标获取像素颜色half3 albedo = texColor.rgb * _BaseColor.rgb; //物体本身颜色的最大反射率half3 c = albedo * diffuse + specular;return float4(c, 1);}ENDHLSL} // Pass} // SubShader
}

 

参考

URP基础光照 - 简书

【Unity Shader】在URP里写Shader(三):URP简单光照Shader - 知乎

 

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

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

相关文章

python SQLAlchemy ORM——从零开始学习 01 安装库

01基础库 1-1安装 依赖库:sqlalchemy pip install sqlalchemy #直接安装即可1-2导入使用 这里讲解思路【个人的理解】,具体写其实就是这个框架:导入必要的接口【有创建engine以及declarative_base】通过create_engine接口创建engine,根据翻译可以翻译成引擎,和发动机一样,…

WinForm之MDI窗体开发详解

在WinForm开发中,如果有多个页面进行展示,通常采用菜单栏+容器布局方式(点击菜单栏,打开新的页面,并在容器中显示)。今天以一个简单的小例子,简述如何通过菜单栏和MDI容器实现页面的布局,仅供学习分享使用,如有不足之处,还请指正。在WinForm开发中,如果有多个页面进…

WinForm开发之MDI窗体开发详解

在WinForm开发中,如果有多个页面进行展示,通常采用菜单栏+容器布局方式(点击菜单栏,打开新的页面,并在容器中显示)。今天以一个简单的小例子,简述如何通过菜单栏和MDI容器实现页面的布局,仅供学习分享使用,如有不足之处,还请指正。在WinForm开发中,如果有多个页面进…

【 lvgl专题】LVGL核心部件——弧(arc)控件的介绍

概述 本文介绍LVGL核心部件——弧(arc),它由背景和前景弧组成。前景(指示器)可以进行触摸调整。LVGL核心部件——弧(arc)控件 一、部件和样式 LV_PART_MAIN 使用典型的背景样式属性绘制背景,使用圆弧样式属性绘制圆弧。 圆弧的大小和位置将遵循 padding 样式属性。LV_P…

10.18软件设计——工厂方法模式之加密算法

软件设计——工厂方法模式之加密算法 1、类图2、源代码2.1 结构目录2.2 所需jar包这里分享几个下载 jar 包的网址:http://www.mvnrepository.com/http://mvnrepository.com/http://findjar.comhttp://sourceforge.net/注:将 jar 包放入 lib 文件夹后要进行构建路径2.3 Met…

2024.12.14

SQL 语法 SQL(Structured Query Language)是一种用于管理和操作关系数据库的标准语言,包括数据查询、数据插入、数据更新、数据删除、数据库结构创建和修改等功能。。数据库表 一个数据库通常包含一个或多个表,每个表有一个名字标识(例如:"Websites"),表包含带…

在 GoRoute 中使用 NavigationBar

前言 在App 中通常会把主要的几个页面放在下方icon,让使用者能够方便操作,这个元件在flutter 中称为BottomNavigationBar。 而GoRouter则是Flutter 官方所提供的套件,可以用来整合整个专案的路由。 当这两个功能整合在一起的时候,一个不小心呈现出来的效果就会差很多。 准备…

MyWebServer提示501 Server error .php 映射支持模块加载失败!请检查相关模块文件是否存在,版本是否匹配!

前言全局说明MyWebServer提示.php 映射支持模块加载失败!请检查相关模块文件是否存在,版本是否匹配!一、说明 1.1 环境:二、问题 提示:501 Server error .php 映射支持模块加载失败!请检查相关模块文件是否存在,版本是否匹配!三、解决方法 3.1 缺少 fastcgi_mod.dll 文件3.2…

Easy.Admin:基于 .NET 8 和 Vue3 的后台管理系统,支持多种数据库和服务端渲染(SSR)

🌟 介绍 Easy.Admin 是一个高效且灵活的后台管理系统,采用了现代化的技术栈,旨在帮助开发者快速搭建高质量的后台管理平台。这个系统不仅支持 .NET 8 后端开发,还结合了 Vue3 和 TypeScript 前端技术,提供了一个功能强大且易于扩展的管理框架。同时,它还支持多种数据库,…

2024.10,14

HTML 颜色名目前所有浏览器都支持以下颜色名。 141个颜色名称是在HTML和CSS颜色规范定义的(17标准颜色,再加124)。下表列出了所有颜色的值,包括十六进制值。提示: 17标准颜色:黑色,蓝色,水,紫红色,灰色,绿色,石灰,栗色,海军,橄榄,橙,紫,红,白,银,蓝绿色,黄…

RASP从0到1

一、环境配置 在讲晦涩难懂的理论之前,先配个代码环境: https://xz.aliyun.com/t/4902?time__1311=n4%2Bxni0QKmTbG8DBDBqDqpDUO2QooDkbIbReDhttps://xz.aliyun.com/t/4903?time__1311=n4%2Bxni0QKmTbG8DyDBqDqpYHQTRZnpoD按照文1进行环境搭建,文1中文件名应为MANIFEST.MF…

springcloud版本选择

首先到官网:https://spring.io/projects/spring-cloud#overview 本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18658446