005-基础Shader-Blinn光照的实现

2023-11-22 06:20

本文主要是介绍005-基础Shader-Blinn光照的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 用于学习《Unity Shader 入门精要》过程记录

注意点:

1.顶点法线转换至三维空间中,比较特殊,与一般转换不同。

2.Blinn关照计算与理想的反射计算不同。采用:视角向量+主光线向量

在场景中添加一个球体,将Blinn光照赋值给其Material,具体效果如下图

 

Shader "ShaderStudy/005"
{//属性Properties{//定义一个颜色属性 ColorDiffuse_ColorDiffuse ("ColorDiffuse",Color)=(1,1,1,1)//定义一个颜色属性 ColorSpecular 用于高光反射_ColorSpecular("ColorSpecular",Color)=(1,1,1,1)//定义一个数值 FloatGloss 用于控制高光区域大小	(值越大,反射区域越小)_FloatGloss("FloatGloss",Range(1,200))=3}SubShader{Pass{//定义光照模型为 ForwardBaseTags{"LightMode"="ForwardBase"}//CG 程序开始CGPROGRAM//编译指令 顶点着色器代码在 name(vert)中#pragma vertex vert//编译指令 片元着色器代码在 name(frag)中#pragma fragment frag//添加Lighting.cginc库文件 包含_LightColor0#include "Lighting.cginc"//声明颜色属性变量  _ColorDiffusefixed4 _ColorDiffuse;//声明颜色属性变量  _ColorSpecularfixed4 _ColorSpecular;//声明Float属性变量  _FloatGlossfloat _FloatGloss;//定义结构体 用于顶点着色器的输入数据struct v2a{//定义 pos 为模型顶点位置信息float4 pos:POSITION;//定义 normal 为模型顶点法线信息float3 normal:NORMAL;};//定义一个结构,用于顶点着色器的输出数据struct v2f{//定义 posSV 为存放顶点的裁剪空间位置float4 posSV:SV_POSITION;//定义 normalWorld 为存放顶点的法线在三维空间中的单位向量 存贮于TEXCOORD0中float3 normalWorld:TEXCOORD0;//定义 posWorld 为存放顶点在三维空间中的位置 存贮于TEXCOORD1中float3 posWorld:TEXCOORD1;};//顶点着色器 输入参数为结构体v2a(name)  输出参数为结构体 v2f(name)v2f vert(v2a v){v2f o;//计算顶点坐标在 裁剪空间中的位置o.posSV=UnityObjectToClipPos(v.pos);//计算顶点法线在三维空间中的单位向量//法线在空间中的单位向量算法,不同于一般的换算,主要时因为当模型进行缩放时,采用一般方式会算出错误的值o.normalWorld=normalize( mul(v.normal,(float3x3)unity_WorldToObject));//计算顶点在三维空间中的位置o.posWorld=mul(unity_ObjectToWorld,v.pos);return o;}//片元着色器 输入参数为结构体 v2f(name) 输出存贮到渲染目标fixed4  frag(v2f i) : SV_Target{//获取环境光信息fixed3 colorAmblent=UNITY_LIGHTMODEL_AMBIENT.xyz;//获取主平行光在空间坐标系下的单位向量fixed3 normalWorldLightDir=normalize(_WorldSpaceLightPos0.xyz);//片元光照强度*自定义颜色属性*saturate(两向量的投影值Float)//片元向量和平行光之间的关系决定顶点光照的强度,平行时最强,垂直时最弱fixed3 colorDiffuse=_LightColor0.rgb*_ColorDiffuse.rgb*saturate(dot(i.normalWorld,normalWorldLightDir));//半兰伯特光照效果,使物体暗的地方更亮//fixed3 colorDiffuse=_LightColor0.rgb*_ColorDiffuse.rgb*(dot(i.normalWorld,normalWorldLight)*0.5+0.5);//正常的反射效果实现//{//	//顶点的反射向量//	fixed3 normalReflect=normalize(reflect(-normalWorldLight,i.normalWorld));//	//顶点指向摄像机的单位向量  //	fixed3 normalView=normalize(_WorldSpaceCameraPos.xyz-i.posWorld.xyz);//	//片元反射颜色//	fixed3 colorSpecular=_LightColor0.rgb*_ColorSpecular.rgb*pow(saturate(dot(normalReflect,normalView)),_FloatGloss);//环境光的颜色+片元光照颜色//return fixed4(colorAmblent+colorDiffuse+colorSpecular,1.0);//}//Blinn 光照效果{//顶点指向摄像机的单位向量  fixed3 normalView=normalize(_WorldSpaceCameraPos.xyz-i.posWorld.xyz);//场景中的主光线向量+视角向量  根据经验这样计算出的效果比较理想fixed3 normalHalf=normalize(normalWorldLightDir+normalView);fixed3 colorSpecular=_LightColor0.rgb*_ColorSpecular.rgb*pow(saturate(dot(i.normalWorld,normalHalf)),_FloatGloss);//环境光的颜色+片元光照颜色+反光颜色return fixed4(colorAmblent+colorDiffuse+colorSpecular,1.0);}}//CG程序结束ENDCG}}FallBack "Specular"
}

这篇关于005-基础Shader-Blinn光照的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_33997587/article/details/128420862
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/408151

相关文章

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个