当前位置: 首页 > news >正文

分析GlobalIllumination函数的实现

代码在:
E:\OGL\scriptable-render-pipeline-08-global-illumination\Assets\My Pipeline\ShaderLibrary


float3 GlobalIllumination (VertexOutput input, LitSurface surface) 
{
	#if defined(LIGHTMAP_ON)
		float3 gi = SampleLightmap(input.lightmapUV);
		#if defined(DYNAMICLIGHTMAP_ON)
			gi += SampleDynamicLightmap(input.dynamicLightmapUV);
		#endif
		return gi;
	#elif defined(DYNAMICLIGHTMAP_ON)
		return SampleDynamicLightmap(input.dynamicLightmapUV);
	#else
		return SampleLightProbes(surface);
	#endif
}

三种情况:
第1:如果打开了静态光照,那么进行静态光照的采样。如果而且打开了动态光照,那么继续动态光照的采样。
第2:只打开动态光照,采用动态光照。
第3:动静都没有打开,则默认采样灯光探头。

采样静态光照的方法:

float3 SampleLightmap (float2 uv) 
{
	return SampleSingleLightmap(
		TEXTURE2D_PARAM(unity_Lightmap, samplerunity_Lightmap), uv,
		float4(1, 1, 0, 0),
		#if defined(UNITY_LIGHTMAP_FULL_HDR)
			false,
		#else
			true,
		#endif
		float4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0.0, 0.0)
	);
}

这里调用函数SampleSingleLightmap函数,此函数在:
D:\Program Files\Unity2018.3.0f2\Unity\Editor\Data\Resources\PackageManager\Editor\package\ShaderLibrary\EntityLighting.hlsl

real3 SampleSingleLightmap(
TEXTURE2D_ARGS(lightmapTex, lightmapSampler), 
float2 uv, float4 transform, bool encodedLightmap, real4 decodeInstructions)
{
    // transform is scale and bias
    uv = uv * transform.xy + transform.zw;
    real3 illuminance = real3(0.0, 0.0, 0.0);
    // Remark: baked lightmap is RGBM for now, dynamic lightmap is RGB9E5
    if (encodedLightmap)
    {
        real4 encodedIlluminance = SAMPLE_TEXTURE2D(lightmapTex, lightmapSampler, uv).rgba;
        illuminance = DecodeLightmap(encodedIlluminance, decodeInstructions);
    }
    else
    {
        illuminance = SAMPLE_TEXTURE2D(lightmapTex, lightmapSampler, uv).rgb;
    }
    return illuminance;
}

TEXTURE2D_PARAM和TEXTURE2D_ARGS的宏定义:

#define TEXTURE2D_PARAM(textureName, samplerName)                textureName, samplerName
#define TEXTURE2D_ARGS(textureName, samplerName)                 TEXTURE2D(textureName),         SAMPLER(samplerName)

这里的第四个参数:float4 transform是对uv进行缩放和偏移。

// transform is scale and bias
uv = uv * transform.xy + transform.zw;

由于我们传递尽量的uv是已经经过缩放和偏移的(在顶点着色器中进行了处理),所以传递进去的transform是(1,1,0,0),前两个是uv的缩放,后两个是uv的偏移。

#if defined(LIGHTMAP_ON)
	output.lightmapUV = input.lightmapUV * unity_LightmapST.xy + unity_LightmapST.zw;
#endif

第5个参数:encodedLightmap
如果为true:

if (encodedLightmap)
{
    real4 encodedIlluminance = SAMPLE_TEXTURE2D(lightmapTex, lightmapSampler, uv).rgba;
    illuminance = DecodeLightmap(encodedIlluminance, decodeInstructions);
}

SAMPLE_TEXTURE2D定义如下:

#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2)                               textureName.Sample(samplerName, coord2)

采样返回的是#define real4 half4(手机平台)或者是#define real4 float4
DecodeLightmap函数如下:
// Remark: baked lightmap is RGBM for now, dynamic lightmap is RGB9E5

real3 DecodeLightmap(real4 encodedIlluminance, real4 decodeInstructions)
{
	#if defined(UNITY_LIGHTMAP_RGBM_ENCODING)
	    return UnpackLightmapRGBM(encodedIlluminance, decodeInstructions);
	#elif defined(UNITY_LIGHTMAP_DLDR_ENCODING) //双倍低动态double low dynamic range(色值乘二...)
	    return UnpackLightmapDoubleLDR(encodedIlluminance, decodeInstructions);
	#else // (UNITY_LIGHTMAP_FULL_HDR)
	    return encodedIlluminance.rgb;
	#endif
}

第一个:UnpackLightmapRGBM

real3 UnpackLightmapRGBM(real4 rgbmInput, real4 decodeInstructions)
{
	#ifdef UNITY_COLORSPACE_GAMMA
	    return rgbmInput.rgb * (rgbmInput.a * decodeInstructions.x);
	#else
	    return rgbmInput.rgb * (PositivePow(rgbmInput.a, decodeInstructions.y) * decodeInstructions.x);
	#endif
}

第二个:UnpackLightmapDoubleLDR

real3 UnpackLightmapDoubleLDR(real4 encodedColor, real4 decodeInstructions)
{
    return encodedColor.rgb * decodeInstructions.x;
}

看两个宏:LIGHTMAP_HDR_MULTIPLIER 和 LIGHTMAP_HDR_EXPONENT

#define LIGHTMAP_RGBM_MAX_GAMMA     real(5.0)       // NB: Must match value in RGBMRanges.h
#define LIGHTMAP_RGBM_MAX_LINEAR    real(34.493242) // LIGHTMAP_RGBM_MAX_GAMMA ^ 2.2

#ifdef UNITY_LIGHTMAP_RGBM_ENCODING
    #ifdef UNITY_COLORSPACE_GAMMA
        #define LIGHTMAP_HDR_MULTIPLIER LIGHTMAP_RGBM_MAX_GAMMA
        #define LIGHTMAP_HDR_EXPONENT   real(1.0)   // Not used in gamma color space
    #else
        #define LIGHTMAP_HDR_MULTIPLIER LIGHTMAP_RGBM_MAX_LINEAR
        #define LIGHTMAP_HDR_EXPONENT   real(2.2)
    #endif
#elif defined(UNITY_LIGHTMAP_DLDR_ENCODING)
    #ifdef UNITY_COLORSPACE_GAMMA
        #define LIGHTMAP_HDR_MULTIPLIER real(2.0)
    #else
        #define LIGHTMAP_HDR_MULTIPLIER real(4.59) // 2.0 ^ 2.2
    #endif
    #define LIGHTMAP_HDR_EXPONENT real(0.0)
#else // (UNITY_LIGHTMAP_FULL_HDR)
    #define LIGHTMAP_HDR_MULTIPLIER real(1.0)
    #define LIGHTMAP_HDR_EXPONENT real(1.0)
#endif

SampleDynamicLightmap

float3 SampleDynamicLightmap (float2 uv) 
{
	return SampleSingleLightmap(
		TEXTURE2D_PARAM(unity_DynamicLightmap, samplerunity_DynamicLightmap), uv,
		float4(1, 1, 0, 0), false,
		float4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0.0, 0.0)
	);
}

SampleLightProbes

float3 SampleLightProbes (LitSurface s) 
{
	if (unity_ProbeVolumeParams.x) 
	{
		return SampleProbeVolumeSH4(
			TEXTURE3D_PARAM(unity_ProbeVolumeSH, samplerunity_ProbeVolumeSH),
			s.position, s.normal, unity_ProbeVolumeWorldToObject,
			unity_ProbeVolumeParams.y, unity_ProbeVolumeParams.z,
			unity_ProbeVolumeMin, unity_ProbeVolumeSizeInv
		);
	}
	else {
		float4 coefficients[7];
		coefficients[0] = unity_SHAr;
		coefficients[1] = unity_SHAg;
		coefficients[2] = unity_SHAb;
		coefficients[3] = unity_SHBr;
		coefficients[4] = unity_SHBg;
		coefficients[5] = unity_SHBb;
		coefficients[6] = unity_SHC;
		return max(0.0, SampleSH9(coefficients, s.normal));
	}

这里拒绝追踪了,再见!!!

相关文章:

  • UVa 10474 Where is the Marble?
  • 光照贴图的中的编码格式
  • macOS U盘制作启动系统
  • 再谈gamma校正——重要知识点
  • 微信小程序小结
  • RenderDoc截取unity帧,分析shader
  • pc和android平台下lightmap的质量选取导致的宏变化
  • mac 笔记本编辑文本命令
  • SHADOWS_SCREEN宏打开的时机
  • swagger 如何在UI界面加入Authentication token值
  • unity屏幕空间阴影
  • UNITY_NO_SCREENSPACE_SHADOWS打开时机
  • mixed模式下烘焙shadowmask记录的数据
  • 第七章 数组实验
  • unity_OcclusionMaskSelector
  • php的引用
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • github指令
  • javascript 总结(常用工具类的封装)
  • JavaScript-Array类型
  • JavaScript函数式编程(一)
  • js作用域和this的理解
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • SQLServer插入数据
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 给Prometheus造假数据的方法
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 无服务器化是企业 IT 架构的未来吗?
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 学习笔记TF060:图像语音结合,看图说话
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 1.Ext JS 建立web开发工程
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​ssh免密码登录设置及问题总结
  • #AngularJS#$sce.trustAsResourceUrl
  • #define、const、typedef的差别
  • (2.2w字)前端单元测试之Jest详解篇
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (二十三)Flask之高频面试点
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)3D模板阴影原理
  • (转)Google的Objective-C编码规范
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Micro Framework初体验
  • .NET Reactor简单使用教程
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net对接阿里云CSB服务
  • .net解析传过来的xml_DOM4J解析XML文件
  • .Net面试题4
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .php文件都打不开,打不开php文件怎么办
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题