搞定冯乐乐入门精要的第七章基础光照之没用的疑难杂症886

以下是基础光照的导图:逐顶点分支与逐像素一致,图略。逐三角形一般不适用于平滑几何体,因此很少用到,略。

在做基本光照模型时,不管是做哪个着色频率(逐顶点、逐像素)都有一个基本思路:

  1. 首先一定要理解基本光照模型的原理,也就是知道公式背后的含义
  2. 想清楚要做逐顶点还是逐像素,这意味着你会在vertexshader还是fragment shader中写光照计算的代码;意味着你要规定v2f结构体的数据内容。
  3. 想清楚为了计算光照需要什么变量(光照公式中有哪些变量),为了得到这些变量数据,需要做什么?有哪些是unity内置变量可以直接得到?意味着你要计算还是找内置变量/函数以及你要写上内置变量相应的cginc库
  4. 这些变量是在什么坐标空间(模型空间?世界空间?)下计算的?意味着你要做坐标变换。
  5. 套公式进去计算,return color

下面是写代码时我遇到的问题:

问题1:逐片元光照时,在vertexshader中归一化了法向量,传入片元中直接使用为什么会出错呢?

计算光照要用归一化的向量,我就想,在顶点着色器归一化向量之后再传到片元着色器不是一样的吗?(现在:你脑子瓦特了,当然不一样啊。

这个问题在哪里呢,在于我脑子里没有很清晰的渲染管线的概念,顶点着色器中的法线是每个顶点都有的,而片元着色器中的法线是会在三角面片内部上进行插值,从而才能得到平滑的法线信息。所以传入的法线如果直接用了,哪怕之前归一化过,现在也并不是归一化的呀~当然会出错呀~

问题2:为什么将法线从模型空间变换到世界空间时与顶点的变换式子不同?

知识点太多专门写了一篇文章解释:涉及到法线的空间变换问题(法线是矢量而模型顶点是一个点,做变换时矢量需要舍弃平移的影响)。具体戳下面的文章

//为什么这个是右乘矩阵?为什么要(float3x3)
o.worldNormal =  mul(v.normal,(float3x3)unity_WorldToObject);
o.worldVertexPos = mul(unity_ObjectToWorld, v.vertex).xyz;

aganztracy:图形学 | Shader |用一篇文章理解法线变换、切线空间、法线贴图​zhuanlan.zhihu.com

问题3:虽然没有人在vertexshader中做纹理采样...但是我就是想试试,用tex2d采样时为什么不行?

搜到的答案说:

顶点纹理采样只在Shader Model 3中支持,并且无法使用tex2d()函数tex2D()实际上是一个快捷方式,它指出“找出正确的mip级别来自动进行采样” – 在片段着色器中,这是使用隐式导数完成的,但是这些在顶点阶段不可用。所以,我们需要使用更明确的tex2dlod()(它可以在顶点和片段阶段工作)。这个函数需要一个4分量vector,其xy是uv空间中熟悉的纹理坐标, w表示从哪个mip级别采样(0是可用的最高分辨率)。

Why can't I sample a texture in a vertex shader?​gamedev.stackexchange.com

然后我就用tex2dlod()采样,法线分辨率好低,是因为网格顶点数实在太少了~

左图顶点数目较多,因此纹理更清晰
正方体只有8个顶点,基本采样成一个颜色了

以上我的问题就得到解决了,其实我的问题似乎也没什么意义,主要是对管线还不够亲密。但是对于自己“偏偏想试试这样做会怎么样”的想法,我觉得还挺有趣。所以就写文记录一下~希望自己以后也多问为什么。

附录代码

代码使用方法:在vertexshader和fragmentshader中只能同时打开同一个序号进行计算,如下面都打开了代码段【1】的内容进行逐片元光照。

  • 【1】逐片元光照(逐像素光照)
  • 【2】内置函数的逐片元光照(逐像素光照)
  • 【3】逐顶点光照
//因为当前渲染路径是前向渲染的第一个pass: ForwardBase。只有平行光,平行光是没有光照衰减的
Shader "ZTQShaders/blinnPhongShader"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Diffuse ("Diffuse",Color) = (1, 1, 1, 1)_Specular ("Specular",Color ) = (1, 1, 1, 1)_Gloss ("Gloss",Range(1.0,256)) = 20}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2vb{float4 vertex : POSITION;//必做步骤float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;//必做步骤//fixed3 color :COLOR;float3 worldNormal :TEXCOORD1;float3 worldVertexPos :TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Diffuse;fixed4 _Specular;float _Gloss;v2f vert (a2v v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);//模型空间到齐次剪裁空间(vertex shader 必做步骤,尽管代码中并未使用,也要做变换,因为管线之后的操作都需要用到)o.uv = TRANSFORM_TEX(v.uv, _MainTex);//自动使用了纹理对应的ST变量对纹理做偏移和缩放变换// o.uv = v.uv.xy*_MainTex_ST.xy+_MainTex_ST.zw; //效果等上///【1】【2】逐片元光照o.worldNormal =  mul(v.normal,(float3x3)unity_WorldToObject);//为什么这个是右乘矩阵?为什么要(float3x3)o.worldVertexPos = mul(unity_ObjectToWorld, v.vertex).xyz;/逐片元光照【3】逐顶点光照以下所有向量都是在world space 中,仅此使用之前1要转换到世界坐标系 2要归一化// fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);// fixed3 normalDir = normalize(mul(v.normal,(float3x3)unity_WorldToObject));//为什么这个是右乘矩阵?为什么要(float3x3)// fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz -  mul(unity_ObjectToWorld, v.vertex).xyz);//而这个是左乘矩阵?// //// fixed3 albedo =  tex2Dlod(_MainTex,fixed4(o.uv,0,0)) *_Diffuse.rgb ;//顶点着色器中无法用tex2d 对纹理进行采样,此处用tex2Dlod// fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;// //// fixed3 diff = _LightColor0.rgb * albedo.rgb * saturate(dot(normalDir,lightDir));// //// fixed h_scl= 0.5;// fixed h_bia = 0.5;// fixed3 diff_half  =_LightColor0.rgb * albedo.rgb * (h_scl*dot(normalDir,lightDir)+h_bia);// //// fixed3 reflectDir = normalize(reflect(-lightDir,normalDir));// fixed3 spec =  _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir,viewDir)),_Gloss);// //// fixed3 halfDir = normalize(lightDir + viewDir); //half vector// fixed3 spec_half = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(normalDir,halfDir)),_Gloss);// //// o.color = ambient + diff + spec_half;逐顶点光照return o;}fixed4 frag (v2f i) : SV_Target{//【1】逐片元光照(逐像素光照)以下所有向量都是在world space 中,仅此使用之前1要转换到世界坐标系 2要归一化fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 normalDir =normalize(i.worldNormal);//??为什么一定要在这里normalize才正常?// fixed3 normalDir =i.worldNormal;//??为什么一定要在这里normalize才正常?fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz -  i.worldVertexPos);//而这个是左乘矩阵?//fixed3 albedo = tex2D(_MainTex, i.uv) * _Diffuse.rgb ;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;//fixed3 diff = _LightColor0.rgb * albedo.rgb * saturate(dot(normalDir,lightDir));//fixed h_scl= 0.5;fixed h_bia = 0.5;fixed3 diff_half  =_LightColor0.rgb * albedo.rgb * (h_scl*dot(normalDir,lightDir)+h_bia);//fixed3 reflectDir = normalize(reflect(-lightDir,normalDir));fixed3 spec =  _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir,viewDir)),_Gloss);//fixed3 halfDir = normalize(lightDir + viewDir); //half vectorfixed3 spec_half = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(normalDir,halfDir)),_Gloss);//fixed4 col = fixed4(ambient + diff + spec_half,1.0);// col =fixed4(normalDir,1); //fortest// col =fixed4(i.worldNormal,1);//fortest//逐片元光照(逐像素光照)//【2】内置函数的逐片元光照(逐像素光照)// fixed3 worldNormal = normalize(i.worldNormal);// fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldVertexPos));//内置函数计算lightdirection// fixed3 albedo = tex2D(_MainTex, i.uv) * _Diffuse.rgb ;// fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;// fixed3 diff = _LightColor0.rgb * albedo.rgb * max(0, dot(worldNormal, worldLightDir));// fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldVertexPos));//内置函数计算viewdirection// fixed3 halfDir = normalize(worldLightDir + viewDir);// fixed3 spec = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);// fixed4 col= fixed4(ambient + diff + spec, 1.0);内置函数的逐片元光照(逐像素光照)//【3】逐顶点光照// fixed4 col = fixed4(i.color,1);// sample the texture//逐顶点光照return  col;}ENDCG}}
}

sv信道模型是什么_Unity Shader|基本光照模型实现中遇到的疑思相关推荐

  1. unity 太阳自发光_unity shader基础之——unity中实现环境光、自发光

    上篇主要讲的是unity中的光照模型及其原理,还有几种光照类型(自发光.环境光.漫反射.高光反射),后面几篇文章就开始在unity中实现这几种光照类型,本篇在unity实现自发光.环境光. 一.uni ...

  2. 基于MATLAB的SUI信道模型的理论分析与仿真

    为了仿真一个无线接收机接受信号强度的变化,我们需要知道:接收机所处的地理环境, 接收机到发射机的各个路径信号所受的影响,多普勒频偏等,即信道模型.对于频域单载波(SC-FDE) 技术,IEEE802. ...

  3. 使用opengl编程实现一个三维渲染实体_Unity Shader学习随记_01_渲染流水线

    什么是Shader?它和Material(材质)的关系 Shader,中文翻译:着色器,是可编程图形管线的算法片段 Shader实际上就是一小段程序,它负责将输入的顶点数据以指定的方式和输入的贴图或者 ...

  4. matlab多径信道模型,基于matlab的无线多径信道建模与仿真分析

    基于matlab的无线多径信道建模与仿真分析 基于MATLAB的无线多径信道建模与仿真分析 摘 要:对于无线通信, 衰落是影响系统性能的重要因素, 而不同形式的衰落对于信号产生的影响 也不相同.本文在 ...

  5. 信道模型多径传播阴影衰落——无线接入与定位(2)

    无线网络中电磁波的传播方式有反射与透射,衍射,散射. 多径传播的影响: 当发射端接近于接收端时,以直接视距(LOS)路径的功率为主,其他路径(由不同机制产生)的功率可以忽略:随着接收端远离接入点,其他 ...

  6. 31、OPNET信道模型概述

    在OPNET模型中,当包被传送到发送器请求发送后,实际中的情况是包将立即被发送到通信信道上进行传输,因此OPNET必须对通信信道进行建模,也就是在模型中要实现物理层的特征,以便将信道对包产生的传输效果 ...

  7. 无人机通信信道模型实现代码

    无人机通信信道模型实现 import numpy as npclass Channel_Param:@propertydef a(self):return self._a@propertydef b( ...

  8. MIMO-OFDM无线通信技术及MATLAB实现(3)MIMO信道模型

    目录 MIMO统计信道模型 空间相关性 PAS模型 多簇 I-METRAMIMO信道 相关MIMO衰落信道的统计模型 相关MIMO信道系数的产生 I-METRAMIMO信道 多普勒谱 莱斯衰落 方向矩 ...

  9. 科研成果 | 信道模型 | 原理及随机数仿真 | 均匀、正态、双高斯、瑞利、莱斯、对数正态、nakagami、Suzuki分布的随机数仿真(matlab)

    文章目录 1. 基础概念 1.1 信道建模的意义 1.2 分布函数和概率密度函数 1.3 连续型随机变量 1.3 离散型随机变量 2. 无线信道 2.1 无线信道损耗类型 2.2 无线信道衰落分类 2 ...

最新文章

  1. 系统定制封装 step1
  2. 解决rspec 生成报告时报utf-8错误的方法
  3. (八)ThreadLocal的使用及原理分析
  4. 200903阶段一C++
  5. python 字符串和时间格式(datetime)相互转换-
  6. HttpClient 发送 HTTP、HTTPS 请求的简单封装
  7. c读取txt文件_第93天:文件读写
  8. mapreduce分组统计_如何优雅的理解MapReduce
  9. 项目实战之vue掘金小册`WebApp`
  10. autoCAD 向图形中添加文字
  11. android时钟计时器代码,android的Handle计时器实现代码
  12. Meltdown(熔断漏洞)- Reading Kernel Memory from User Space/KASLR | 原文+中文翻译
  13. 个人自媒体技术分享博客网站模板
  14. 电商大数据应用之用户画像
  15. c语言转fpga原理,要想玩转FPGA,就必须理解FPGA内部的工作原理-可编程逻辑-与非网...
  16. 速途研究院联合融云:中国移动社交沟通指数报告
  17. 《一个人的朝圣》—— 读后总结
  18. 51单片机的计时器和计数器
  19. Atari 游戏训练 -- 2. 基于jupyter,图片处理 + state更新 + 经验回放数据初始化
  20. 第二十二章、邮件服务器: Postfix

热门文章

  1. interllij IDEA2017快捷键风格修改为myEclipse快捷键风格
  2. 恒大汽车:仍在就出售新能源汽车生活项目等资产进行磋商
  3. 京东企业租赁11.11:新用户数环比增长786% 订单量环比增长519%
  4. 田园主义创始人发布致歉声明:测算失误导致热量差异
  5. 一加9R将推12+256GB新版本:骁龙870+120Hz高刷屏
  6. 又增长了,微信及WeChat月活达12.25亿 !
  7. 1499元被标149元,苹果官网产品出现Bug价后续:白高兴了!
  8. 一波三折,这些离国出走的品牌又回来了!
  9. 为啥月饼也能变成期货?
  10. 能自定义桌面后,iOS用户玩疯了