Unity Shader - 基础光照之高光反射(Specular)

镜面高光的CG实现
本文探讨了镜面反射(高光)在计算机图形学中的应用,详细讲解了如何利用反射光方向和视角方向的夹角计算镜面反射强度,并提供了一段Shader代码实例,展示了如何在实际项目中实现这一效果。

镜面高光

上节学习了漫反射,这节我们来探索下镜面反射(高光),镜面反射可以让物体看起来是有光泽的,比如金属材质。
通过上图我们可以清楚的看到,镜面反射和入射光,法向量,反射光方向,视角方向这几个因素有关, 很明显我们可以通过反射光的方向和视角方向的夹角来计算镜面反射强度,如果夹角越小,那么镜面反射光的强度就越大。
计算公式:
在CG中,我们可以通过 reflect(I,n) 函数来计算反射光方向, I 代表入射光方向, n 代表法向量。
更多常用函数可以参考 这篇文章
shader代码:
    
//高光反射(Specular) Shader "lcl/005_Specular_fargment" { Properties { //主纹理 _MainTex ( "Texture" , 2D ) = "white" { } //整体颜色 _Color ( "Diffuse Color" , Color ) = ( 1 , 1 , 1 , 1 ) // 高光颜色 _Specular ( "_Specular Color" , Color ) = ( 1 , 1 , 1 , 1 ) // 高光强度 _Gloss ( "Gloss" , Range ( 8 , 200 ) ) = 10 } SubShader { Pass { Tags { "LightMode" = "ForwardBase" } CGPROGRAM #include "Lighting.cginc" # pragma vertex vert # pragma fragment frag // 变量定义 sampler2D _MainTex ; fixed4 _Color ; half _Gloss ; fixed4 _Specular ; //CPU传输到顶点着色器的数据 struct a2v { // 顶点坐标 float4 vertex : POSITION ; // 法向量 float3 normal : NORMAL ; // 纹理坐标 float3 texcoord : TEXCOORD0 ; } ; //顶点传输到片元着色器的数据 struct v2f { //顶点坐标 float4 position : SV_POSITION ; // 世界空间下的法向量 float3 worldNormal : TEXCOORD0 ; // 世界空间下坐标 float3 worldVertex : TEXCOORD1 ; // 纹理坐标 float3 texcoord : TEXCOORD2 ; } ; //顶点着色 v2f vert ( a2v v ) { v2f f ; f . position = UnityObjectToClipPos ( v . vertex ) ; f . worldNormal = mul ( v . normal , ( float3x3 ) unity_WorldToObject ) ; f . worldVertex = mul ( v . vertex , unity_WorldToObject ) . xyz ; f . texcoord = v . texcoord ; return f ; } ; // 片元着色器 fixed4 frag ( v2f f ) : SV_TARGET { //纹理颜色 float4 texColor = tex2D ( _MainTex , f . texcoord ) ; // 环境光 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT . rgb ; //法向量 fixed3 normalDir = normalize ( f . worldNormal ) ; // 光源方向 fixed3 lightDir = normalize ( _WorldSpaceLightPos0 . xyz ) ; //漫反射 fixed3 diffuse = _LightColor0 . rgb * max ( dot ( normalDir , lightDir ) , 0 ) * _Color . rgb ; //反射光计算 fixed3 reflectDir = reflect ( - lightDir , normalDir ) ; //计算视角方向 fixed3 viewDir = normalize ( _WorldSpaceCameraPos . xyz - f . worldVertex ) ; //计算高光反射 fixed3 specular = _LightColor0 . rgb * pow ( max ( 0 , dot ( viewDir , reflectDir ) ) , _Gloss ) * _Specular ; //合并漫反射,环境光,高光反射 fixed3 tempColor = diffuse + ambient + specular ; //融合纹理颜色 return fixed4 ( tempColor * texColor . rgb , 1 ) ; } ; ENDCG } } FallBack "VertexLit" }
效果颜色;
内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值