普通光照模型:unityshader

2023-11-14

我们都知道物体表面的光照是由:自发光+镜面光(高光)+环境光+漫反射得出来的:

环境光:光照系数*环境光颜色

Ambient=K*GlobalAmbient;

漫反射:
在这里插入图片描述

Diffuse=K*LightColor*max(dot(N,L),0) ;

反射光线:两倍的水平投影减去入射光线,得到反射光线
镜面反射:k为高光系数

Specular=LightColor*pow(max(dot(N*R),0),K);

自发光:那就直接是纹理+uv了:

EmissIve=K;

嗯,就这些了:
代码:

Shader "Custom/XXXshader"
{
	 Properties
    {  
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Ambiel_K("Ambiel_K",Float) = 1
		_Diff_K("Diff_K", Float) = 1
		_Diff_Color("Diff_Color", Color) = (1, 0, 0, 1)
		_HLight_K("HLight_K", Float) = 1
		_Specular_Color("Specular_Color", Color) = (1, 0, 0, 1)
    }
	SubShader
	{
		Tags{ "RenderType" = "Opaque" }
		LOD 100

		pass {
		//cg语言开始编写
		CGPROGRAM

			//在逻辑中申明顶点和片段://编译申明函数
			//顶点程序
			#pragma vertex vert
			//片段程序
			#pragma fragment frag

			#include "UnityCG.cginc"
			sampler2D _MainTex;
			float4 _MainTex_ST;

			float _Ambiel_K;
			float _Diff_K;
			float4 _Diff_Color;
			float _HLight_K;
			float4 _Specular_Color;
			
			struct v2f {
				float4 Position : POSITION0;
				float2 Texcoord : TEXCOORD0;
				float3 Normal: TEXCOORD1;
				float3 LightDir: TEXCOORD2;
				float3 ViewDir:TEXCOORD3;
			};
			struct Input
			{
				float4 Position : POSITION0;
				float2 Texcoord : TEXCOORD0;
				float3 Normal   : NORMAL;
			};
			//自发光+镜面反射+漫反射+环境光
			v2f vert(Input i)
			{
				v2f o;
				o.Position = UnityObjectToClipPos(i.Position);
				o.Texcoord = TRANSFORM_TEX(i.Texcoord, _MainTex);
				//o.Normal = mul(i.Normal, (float3x3)_World2Object);
				o.Normal = i.Normal;
				o.LightDir = ObjSpaceLightDir(i.Position);//把光向量从世界空间转成模型空间
				o.ViewDir = ObjSpaceViewDir(i.Position);  //当前点到摄像机的方向(视线)
				return o;
			}
			float4 frag(v2f i) :COLOR
			{
				float3 L = normalize(i.LightDir);
				float3 N = normalize(i.Normal);
				float3 viewdir = normalize(i.ViewDir); //视线
				//漫反射=漫反射颜色 * 漫反射系数 * max(N,L);   saturate:这样是为了约束平滑到0-1之间
				float3 diff = _Diff_Color * _Diff_K* saturate(max(dot(L, N), 0));
				//环境光=环境光颜色 * 环境光系数
				float3 Ambiel = UNITY_LIGHTMODEL_AMBIENT.rgb*_Ambiel_K;
				//反射光线计算=两倍的水平投影减去入射光线
				float3 refl = 2 * saturate(max(dot(L, N), 0)*i.Normal) - L;
				//镜面反射(高光)=直射光颜色 * pow(max(dot(当前点的反射光方向,当前点到摄像机的方向),0),高光反射参数)
				float3 Specular = _Specular_Color* pow(max(dot(refl, viewdir), 0), _HLight_K);

				//自发光
				float4 color = tex2D(_MainTex, i.Texcoord);

				//光照模型:自发光+镜面反射+漫反射+环境光
				fixed4 col = color * float4(Specular + diff + Ambiel, 1);

				return col;
			}
			ENDCG
		}

	}
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

普通光照模型:unityshader 的相关文章

  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 使用 python opengl (PyOpenGL) 创建几何着色器失败

    我想使用 glCreateShader GL GEOMETRY SHADER 创建 Geometry shader 但出现错误 Traceback most recent call last File test py line 9 in
  • Threejs DataTexture 未更新

    更新 问题是每次都会重新创建 texData 对象 因此 DataTexture 的引用丢失 WestLangley 的解决方案是覆盖 texData 中的数据 而不是重新创建 texData 对象 我有一个简单的 Threejs 场景Da
  • 如何通过GLSL在THREE.js中实现MeshNormalMaterial?

    我想实现一个像这样的着色器网格法线材质 https threejs org docs api materials MeshNormalMaterial 但我不知道如何将法线转换为颜色 在 THREE js 中 我的测试1 varying v
  • 如何使用 WebGL 和 GLSL 在 J/s 文件中运行 Shadertoy 中的着色器?

    我是着色器编程新手 我想使用 WebGL 和 GLSL 创建一个着色器 为了了解它的实际工作原理 我想测试 Shadertoy 的着色器 但是如何从 Shadertoy 获取代码并实际在 J S 文件中运行它呢 您是否只需将 Shadert
  • 移动物体的漫射照明

    当计算移动物体的漫射照明时 我必须将光源与物体本身一起移动 Override public void draw draw frame Move object GLES20 glVertexAttribPointer aPositionLin
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 使用 LibGDX 的法线贴图 GLSL

    我尝试使用 LibGDX 实现法线贴图 因此 当我在顶点着色器中计算漫反射和镜面反射颜色时 我得到了一些积极的结果 至少我这么认为 顶点着色器 attribute vec4 a position attribute vec2 a texCo
  • Directx 11,将多个纹理发送到着色器

    使用此代码我可以将一个纹理发送到着色器 devcon gt PSSetShaderResources 0 1 pTexture 当然 我通过以下方式制作了 pTexture D3DX11CreateShaderResourceViewFro
  • OpenGL Phong 光照:镜面高光错误

    我的 OpenGL 中的 Phong 光照着色器似乎有一个奇怪的问题 镜面高光出现在对象的错误一侧 手头的问题 正如您所看到的 镜面高光出现在立方体的另一侧 从灯光的角度来看 也出现在立方体垂直边缘的角上 它应该只出现在最靠近灯光的一侧 立
  • 使用 texelFetch() 进行纹理化

    当我将非最大值传递到纹理缓冲区时 在渲染时它会绘制具有最大值颜色的几何图形 我在使用 glTexBuffer API 时发现了这个问题 例如 假设我的纹理数据是GLubyte 当我传递任何小于255的值时 那么颜色与用255绘制的颜色相同
  • 着色器:如何在不生成几何体的情况下绘制 3D 点顶点?

    我有一个 3D Webgl 场景 我正在使用Reglhttp regl party http regl party 这就是WebGL 所以我本质上是直接写 GLSL 这是一个游戏项目 我有一个 3D 位置数组 x y z 它们是子弹或射弹
  • GLSL 纹理立方体和纹理2D 在同一着色器中

    我似乎无法两者兼得texture2D and textureCube 在一个着色器中 当我这样做时 什么也没有显示 也没有错误 我用我自己的着色器加载器和 Apple GLSL 着色器生成器尝试了这一点 并且发生了同样的事情 即使我有也会发
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • Unity 后处理 PostProcessEffectRenderer 在编辑器中显示,但在构建中不显示

    将 PostProcessEffectRenderer 的实现添加到 Unity 后处理堆栈后 效果在 Unity 编辑器中完美运行 但不会在构建的游戏中显示 对构建质量的更改没有效果 使用针对 Windows x86 64 构建的最高质量
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 根据 GLSL 中向量的特定分量执行最小-最大的最快方法?

    我需要在我的 GLSL 代码中多次调用这种函数 vec2 minx vec2 a vec2 b if a x lt b x return a else return b 我担心过度分支 有没有办法避免 if else 结构 我建议使用 GL
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor

随机推荐

  • 医学图像识别:基于cnn的病变细胞识别 完整代码数据 视频讲解

    项目代码讲解请看视频 医学图像识别 基于cnn的病变细胞识别 哔哩哔哩 bilibili 结果 from keras preprocessing image import ImageDataGenerator load img img to
  • RBAC简介(*)

    一 RBAC是什么 1 RBAC模型概述 RBAC是Role Based Access Control的英文缩写 意思是 基于角色的访问控制 RBAC实际上就是针对产品去挖掘需求时所用到的Who 角色 What 拥有什么资源 How 有哪些
  • PYQT制作动态时钟

    所有代码 import sys from PyQt5 QtCore import Qt QTimer QRect from PyQt5 QtGui import QPixmap QTransform QPainter QImage from
  • android沉浸式状态栏以及状态栏颜色更改

    版本要求 沉浸式状态栏效果是在android 4 4的时候出现的 所以只有Android4 4及以后的版本才能使用沉浸式效果 实现方式 大体上可以分为两种思路 1 修改状态栏的颜色使之与标题栏的背景色保持一致 以达到沉浸式效果 2 修改状态
  • MongoDB 数据库创建删除、表(集合)创建删除、数据增删改查

    数据库使用 开启 mongodb 服务 要管理数据库 必须先开启服务 开启服务使用 mongod dbpath D mongodb 管理 mongodb 数据库 mongo 一定要在新的 cmd 中输入 清屏 cls 查看所有数据库列表 s
  • Java—面向对象——作用域

    一 基本使用 1 在java编程中 主要的变量就是属性 成员变量 和局部变量 2 局部变量一般是指在成员方法中定义的变量 3 java中作用域的分类 全局变量 也就是属性 作用域为整个类体 局部变量 也就是除了属性之外的其他变量 作用域为定
  • ES 搜索21 (function_score查询 关键字 functions 和 weight 滤集提升权重分)

    过滤集提升权重 回到 忽略 TF IDF 里处理过的问题 我们希望根据每个度假屋的特性数量来评分 当时我们希望能用缓存的过滤器来影响评分 现在 function score 查询正好可以完成这件事情 到目前为止 我们展现的都是为所有文档应用
  • kubesphere多集群管理,实现kubernetes多集群同时应用部署

    文章目录 一 kubesphere集群部署 1 准备环境 2 下载kubesphere安装工具KubeKey 3 准备集群部署配置文件 4 安装集群 5 验证安装 二 配置多集群 1 打开集群tower服务的nodeport端口 2 修改主
  • Jenkins:(看起来挺好看的)邮件模板样式

    Jenkins 邮件模板样式目录导航 邮件模板样式一 根据样式三改编 背景图自定义 邮件模板样式二 邮件模板样式三 邮件模板样式四 邮件模板样式一 根据样式三改编 背景图自定义
  • Linux上安装和使用Wireshark

    CentOS下安装Wireshark相当简单 两条命令就够了 这里 主要是记录写使用方面的东西 安装 1 yum install wireshark 注意这样并无法使用wireshark命令和图形界面 但提供了抓包基本功能 2 yum in
  • Dlib库中实现正脸人脸关键点(landmark)检测的测试代码

    Dlib库中提供了正脸人脸关键点检测的接口 这里参考dlib examples face landmark detection ex cpp中的代码 通过调用Dlib中的接口 实现正脸人脸关键点检测的测试代码 测试代码如下 referenc
  • 2014年1月14日星期二(DEMO7-2,加载3D线框立方体物体模型)

    上个DEMO 是渲染列表 这个DEMO 进行了加载PLG模型 仍然是一步步地进行 PLG模型首行包含了物体名称 顶点数和多边形数3部分组成 加载模型时可以每次读取一行 并对其中的数字进行分析 现在开始进行代码 先设置摄像机坐标和位置 朝向
  • 利用cin和cout完成信息的输入输出(TOZJ练习5681)

    项目场景 问题描述 在dev c 上运行正确 在TZOJ出现Presentation Error 答案和标准结果非常接近 在输出结果中 多了或少了不必要的空格或者回车或者其他 的代码 include
  • Java集合排序

    一 概述 1 集合排序概述 数组排序 int arr 1 2 3 Arrays sort arr 集合排序 使用Collections类中 sort 方法对List集合进行排序 sort List list 根据元素的自然顺序对指定列表按升
  • 基于内容的图像检索(CBIR) ——以图搜图

    文章目录 一 实现原理 二 基于内容的图像检索的特征提取 三 代码实现 打赏 在CBIR中 图像通过其视觉内容 例如颜色 纹理 形状 来索引 一 实现原理 首先从图像数据库中提取特征并存储它 然后我们计算与查询图像相关的特征 最后 我们检索
  • use MinGW compile googletest on windows

    table of contents enviornments brief description of software installation MinGW installation cmake installation googlete
  • word文档墨迹工具的笔不能用_CourseMaker微课制作教程43:手写设备在Word、PPT、PDF里的使用方法大全...

    首先我们要有个概念 手写设备 数位板 纸笔手写板 数位屏 在各个软件里能否书写 跟这些设备硬件本身并没有什么关系 不是说这个牌子的手写板在A软件里能用 那个牌子的手写板在A软件里不能用 能否在软件里手写 主要还是看软件里的手写功能组件是否完
  • linux驱动12:主设备号和次设备号

    dev目录下执行ls l 设备文件项的最后修改日期前的用逗号分割的两个数 对设备文件来说就是相应的主设备号和次设备号 第一个字符c表示字符设备 b表示块设备 主设备号标识设备对应的驱动程序 次设备号由内核使用 用于正确确定设备文件所指的设备
  • [答疑]《软件方法》自测题为什么不直接给出答案?

    软件方法 下 分析和设计第8章连载 20210518更新 gt gt 问题 很多同学说 软件方法 各章的自测题要扫码到全对才知道答案 比较费劲 能不能直接给出答案 统一回答如下 这是有意为之的 这些题是多年积累下来 围绕着书中的知识点精心准
  • 普通光照模型:unityshader

    我们都知道物体表面的光照是由 自发光 镜面光 高光 环境光 漫反射得出来的 环境光 光照系数 环境光颜色 Ambient K GlobalAmbient 漫反射 Diffuse K LightColor max dot N L 0 反射光线