shader- 之高光反射

2023-11-20 18:20
文章标签 shader 之高 光反射

本文主要是介绍shader- 之高光反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Shader "Shadertest/test1Shader" {
    Properties {

        _Diffuse ("Diffuse", Color) = (1,1,1,1)
    }
    SubShader {
        //Tags { "RenderType"="Opaque" }    

        //顶点/片元着色器代码需要卸载pass
        pass{
            Tags{"LightMode" = "ForwardBase"} //定义光照模式 


            CGPROGRAM
            fixed4 _Diffuse;
            #pragma vertex vert //定义顶点着色器
            #pragma fragment frag // 定义片元着色器
            #include "Lighting.cginc" //unity 内置变量
            //输入结构体
            struct a2v  
            {
                float4 vertex : POSITION; //顶点信息
                float3 normal : NORMAL;   //法线信息
            };
            //输出结构体也是片元着色器的输入结构体
            struct v2f
            {
                float4 pos : SV_POSITION;//保存片元着色器中的顶点在裁剪空间中的坐标
                fixed3 color : COLOR;//接收片元着色器中计算出来的光照颜色
            };

            v2f vert(a2v v)
            {
                v2f o;
                //保存顶点在裁剪空间中的坐标信息
                o.pos = UnityObjectToClipPos(v.vertex);
                //得到环境光部分
                fixed3 ambient =  UNITY_LIGHTMODEL_AMBIENT.xyz;
                //把顶点法线转换到世界空间中
                fixed3 worldnormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                //光源方向归一化
                fixed3 worldlight = normalize(_WorldSpaceLightPos0.xyz);
                //光源颜色和强度、漫反射属性、顶点法线、光源方向,利用公式计算
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldnormal,worldlight));
 
                //环境光 + 漫反射光 = 最终光照结果
                o.color = ambient + diffuse;
                return o;
            }
            //片元着色器
            fixed4 frag(v2f i) : SV_Target
            {
                return fixed4(i.color,1.0);    
            }

            ENDCG

        }
        
    }
    FallBack "Diffuse"
}
// 

这篇关于shader- 之高光反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396541

相关文章

Unity3D Shader详解:只画顶点或只画线框

在Unity3D开发中,Shader是控制渲染过程的关键组件,它允许开发者自定义物体的渲染方式。有时,为了特定的视觉效果,我们可能需要只渲染模型的顶点或者只显示其线框。下面,我们将详细探讨这两种效果的技术实现,并给出相应的代码示例。 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 只画顶点 在Unity中直接“只画顶点”的概念可能不是非常直观,因为顶点本身只是模型

unity shader实现一个移动的箭头

Shader "Unlit/LT_Arrow" {     Properties     {         _MainTex ("Texture", 2D) = "white" {}         _MSpeed("MoveSpeed", Range(1, 3)) = 2 //移动速度     }     SubShader     {         //贴图带透明通道 ,半透明效果设置如下

MySQL5.7.36之高可用架构部署-MHA-VIP漂移

1、创建文件 vi /usr/local/bin/master_vip_mysql_mha #!/usr/bin/env perluse strict;use warnings FATAL => 'all';use Getopt::Long;my ($command, $ssh_user, $orig_master_host, $orig_master_i

Java源码学习之高并发编程基础——AQS源码剖析之线程间通信之条件等待队列

1.前言&目录 前言: 在Java中,使用synchronized关键字构建的锁,线程间通信可以使用某对象实例的wait/notify机制完成。AQS同样也提供了一套线程间通信的解决方案——条件等待队列。 在AQS源码分析的两篇文章AQS源码分析(上)、AQS源码分析(下)中,我们知道了,无论是独占锁模式还是共享锁模式,AQS提供的能力是将获取不到锁的线程将它们封装成链表节点的形式组织

Shader学习笔记

1. 渲染管线概述 定义:渲染管线(流水线)就是将数据分阶段的变为屏幕图像的过程 数据就是我们在游戏场景中放置的模型、光源、摄像机等等内容的数据 阶段就是渲染管线中的三个阶段:应用阶段一>几何阶段一>光栅化阶段 通过这三个阶段对数据的处理,最终我们就能够在屏幕上看见最终的图像 2. 应用阶段 应用阶段的大部分内容都和渲染无关(游戏逻辑处理、动画更新、物理模拟)几何阶段和光栅化阶段将开始处理

Keepalived+LVS+Nginx负载均衡之高可用

一、Keepalived介绍    Keepalived是分布式部署系统解决系统高可用的软件,结合LVS(Linux Virtual Server)使用,其功能类似于heartbeat,解决单机宕机的问题。       二、Keepalived技术原理    keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protoco

Shader,想说爱你不容易。

这两天开始接触shader,给我的第一感觉是容易,第二感觉是难,第三赶脚是数学不好就先学数学吧! 首先我们通过unity自己创建一个shader脚本的时候,其实shader已经给我们搭建好了编写shader基本的框架,我们要做的就是往里面写自己的shader,但是写之前总的先认识这里面有啥子东西吧。先创建一个shader瞅瞅,我使用的unity的版本为5.x,代码如下: Shader

UE【材质编辑】Shader模板

【UE 4.27.2】         在UE中双击材质球会进入材质编辑界面。PBR的材质参数呈现为材质蓝图的各个节点,提供数据源,传递进材质。最后材质对其进行组织,呈现为VS,PS等着色器代码,基本流程: 本文会刨析在UE4.27.2中材质模板是如何应用的。 1.认识编辑器中的材质         打开任意材质球,双击进入材质编辑面板: 此界面形象展示了材质参数传递到材质(实例

【Unity Shader】Unity提供的CG/HLSL语义

主要参考《Unity Shader入门精要》一书,外加自己的一些总结 什么是语义 语义实际就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。这些语义可以让Shader知道从哪里读取数据,并把数据输到哪里。 在DirectX10以后,有了一种新的语义类型,即系统数值语义(system-value semantics)。这类语义是以SV

Shader笔记:光照与阴影1

引:旋转动画(三角函数) float3 rotationY(float3 vertex){float c = cos(_Time.y*_Speed);float s = sin(_Time.y*_Speed);float3x3 m = {c,0,s,0,1,0,-s,0,c};return mul(m,vertex);}v2f vert (a2v v){v2f o;o.pos = Unit