自定义着色器
引擎提供了功能强大的自定义着色器系统,以满足您的自定义着色器需求。
NMaterialShader
NMaterialShader是所有自定义的材质着色器的模板,下面介绍如何创建自定义的材质着色器。
您可以在编辑器的资源区,右键创建材质着色器,会默认创建C++类和一对着色器文件(顶点着色器和片段着色器)。
NMaterialShader脚本模版介绍
材质着色器脚本主要由5个部分声明代码组成,分别为自定义材质着色器声明、Object声明、Technique声明、Uniform声明以及反射声明。
其中自定义材质着色器声明在头文件中完成,Object声明、Technique声明、Uniform声明以及反射声明依次在源文件中完成。
自定义材质着色器声明
- 宏定义
#define DECLARE_CUSTOM_MATERIAL_SHADER(className)- 参数
| 参数 | 说明 |
|---|---|
| className | 类名 |
- 描述 在材质着色器的头文件中,通过DECLARE_CUSTOM_MATERIAL_SHADER宏将一些普遍写法定义到一起,以此来减少重复度和升级困难。
#pragma once
#include "Apis/NMaterialShader.h"
ENGINE_NAMESPACE_BEGIN
DECLARE_CUSTOM_MATERIAL_SHADER(CustomUnlit);
ENGINE_NAMESPACE_ENDObject声明
- 宏定义
#define IMPLEMENT_CLASS(className)
#define IMPLEMENT_RTTI_CUSTOM_SHADER(className, baseClassName)- 参数
| 参数 | 说明 |
|---|---|
| className | 类名 |
| baseClassName | 基类名 |
- 描述
您可以通过IMPLEMENT_CLASS和IMPLEMENT_RTTI_CUSTOM_SHADER来声明自定义材质着色器的工厂函数和RTTI信息。 需要注意的是,一般来说这部分都是由模板自动生成,无需更改。
IMPLEMENT_CLASS(CustomUnlit)
IMPLEMENT_RTTI_CUSTOM_SHADER(CustomUnlit, NMaterialShader)Technique声明
- 宏定义
#define DECLARE_MATERIALSHADER_CATEGORY_PATH(ShaderCategoryPath)
#define DECLARE_TECHNIQUE_BEGIN(className)
#define DECLARE_TECHNIQUE_ENTRY_BEGIN(TechniqueName, TechniqueQuality)
#define DECLARE_TECHNIQUE_ENTRY_DEPENDENCY_GL(GLVersion, Entensions)
#define DECLARE_TECHNIQUE_ENTRY_DEPENDENCY_GLES(ESVersion, Entensions)
#define DECLARE_PASS_SHADER_BEGIN(PassName, LightMode)
#define DECLARE_PASS_SHADER_MACRODEFINES(MacroDefines)
#define DECLARE_PASS_SHADER_VERTEX_PATH(ShaderPath)
#define DECLARE_PASS_SHADER_FRAGMENT_PATH(ShaderPath)
#define DECLARE_PASS_SHADER_GEOMETRY_PATH(ShaderPath)
#define DECLARE_PASS_SHADER_TESS_CONTROL_PATH(ShaderPath)
#define DECLARE_PASS_SHADER_TESS_EVALUATION_PATH(ShaderPath)
#define DELCARE_PASS_SHADER_DEPTH_STATE(DepthVariable, State)
#define DELCARE_PASS_SHADER_STENCIL_STATE(StencilVariable, State)
#define DELCARE_PASS_SHADER_BLEND_STATE(BlendVariable, State)
#define DELCARE_PASS_SHADER_RASTER_STATE(RasterVariable, State)
#define DELCARE_PASS_SHADER_POLYGON_STATE(PolygonVariable, State)
#define DECLARE_PASS_SHADER_END
#define DECLARE_TECHNIQUE_ENTRY_END
#define DECLARE_TECHNIQUE_FALLBACK(materialShaderName)
#define DECLARE_TECHNIQUE_REQUIRED_ATTRIBUTE(Semantic)
#define DECLARE_TECHNIQUE_END- 参数
| 参数 | 说明 |
|---|---|
| ShaderCategoryPath | 材质着色器类别路径 |
| className | 类名 |
| TechniqueName | Technique的名称 |
| TechniqueQuality | Technique的质量 |
| GLVersion | Technique的GL的版本依赖 |
| ESVersion | Technique的GLES的版本依赖 |
| Entensions | Technique的拓展需求 |
| PassName | Pass的名称 |
| LightMode | Pass的光照模式 |
| MacroDefines | Pass插入的宏定义 |
| ShaderPath | 着色器路径 |
| DepthVariable | 深度状态 |
| StencilVariable | 模板状态 |
| BlendVariable | 混合状态 |
| RasterVariable | 光栅状态 |
| PolygonVariable | 多边形状态 |
| materialShaderName | 当当前材质着色器没有Technique可用时,递归查找可用Technique |
| Semantic | 材质着色器所需的顶点属性 |
- 描述
在DECLARE_TECHNIQUE_BEGIN和DECLARE_TECHNIQUE_END内,您可以声明材质着色器的类别路径,设置材质着色器的FallBack的材质着色器,以及指定材质着色器的顶点属性,同时您也可以在这里写多个TechniqueEntry来创建Technique。
您可以通过设置Technique的质量和GL、GLES、拓展依赖,来组合控制当前的Technique能否在当前平台正确运行。 您可以在DECLARE_TECHNIQUE_ENTRY_BEGIN和DECLARE_TECHNIQUE_ENTRY_END之间创建多个Pass,以实现多Pass逻辑。 您可以在DECLARE_PASS_SHADER_BEGIN和DECLARE_PASS_SHADER_END中间创建您的Pass,指定您的Pass的光照模式、宏定义、着色器、渲染状态等信息。
需要注意的是,您需要避免materialShaderName为当前材质着色器名,以免存在着色器错误或者没有Technique可用时产生无限递归错误。
/* ------------- TECHNIQUE ---------------- */
DECLARE_TECHNIQUE_BEGIN(CustomUnlit)
DECLARE_MATERIALSHADER_CATEGORY_PATH("Custom/CustomUnlit")
// 声明TechniqueEntry,用于创建Technique
// 第0个Technique
DECLARE_TECHNIQUE_ENTRY_BEGIN("DefaultTechnique", EMaterialQuality::EMQ_Medium)
// 第一个参数为Technique的GL版本依赖,第二个参数为Technique的GL拓展依赖
DECLARE_TECHNIQUE_ENTRY_DEPENDENCY_GL(430, "")
// 第一个参数为Technique的GLES版本依赖,第二个参数为Technique的GLES拓展依赖
DECLARE_TECHNIQUE_ENTRY_DEPENDENCY_GLES(320, "")
// 第一个Pass,声明PassName、光照模式
DECLARE_PASS_SHADER_BEGIN("DefaultPass", EPassLightMode::EPLM_ForwardBase)
// 声明Pass使用时的宏,不同的宏通过|分割
DECLARE_PASS_SHADER_MACRODEFINES("")
// 声明着色器路径,Assets、Shaders开头的的相对路径使用自定义着色器,以EngineAssets开头的相对路径使用引擎内置的着色器
// 声明Pass的顶点着色器路径
DECLARE_PASS_SHADER_VERTEX_PATH("Shaders/CustomUnlit.vs")
// 声明Pass的片段着色器路径
DECLARE_PASS_SHADER_FRAGMENT_PATH("Shaders/CustomUnlit.fs")
// 声明Pass的几何着色器路径
DECLARE_PASS_SHADER_GEOMETRY_PATH("")
// 声明Pass的细分控制着色器路径
DECLARE_PASS_SHADER_TESS_CONTROL_PATH("")
// 声明Pass的细分评估着色器路径
DECLARE_PASS_SHADER_TESS_EVALUATION_PATH("")
// 声明Pass的状态机,[BLEND/DEPTH/RASTER/STENCIL/POLYGON]Variable为状态机种的变量,State为相应的值
DELCARE_PASS_SHADER_BLEND_STATE(enableBlending, false)
DELCARE_PASS_SHADER_DEPTH_STATE(depthTest, true)
DELCARE_PASS_SHADER_DEPTH_STATE(depthWrite, true)
DELCARE_PASS_SHADER_RASTER_STATE(cullMode, ECullMode::CM_BackFace)
DECLARE_PASS_SHADER_END
/*
// 此处可以声明当前Technique的更多Pass
// 例如:声明PreDepthPass
DECLARE_PASS_SHADER_BEGIN("PreDepthPass", EPassLightMode::EPLM_DepthOnly)
DECLARE_PASS_SHADER_END
// 例如:声明ShadowCasterPass
DECLARE_PASS_SHADER_BEGIN("ShadowCasterPass", EPassLightMode::EPLM_ShadowCaster)
DECLARE_PASS_SHADER_END
*/
DECLARE_TECHNIQUE_ENTRY_END
/*
// 此处声明更多的TechniqueEntry,以创建其他的Technique
DECLARE_TECHNIQUE_ENTRY_BEGIN("DefaultTechnique", EMaterialQuality::EMQ_Low)
DECLARE_TECHNIQUE_ENTRY_DEPENDENCY_GL(330, "")
DECLARE_TECHNIQUE_ENTRY_DEPENDENCY_ES(320, "")
// 此处创建相应的Pass
DECLARE_TECHNIQUE_ENTRY_END
*/
// 没有Technique可用时,材质着色器FallBack的材质着色器名称,注意不要循环FallBack
DECLARE_TECHNIQUE_FALLBACK("BlinnPhong")
DECLARE_TECHNIQUE_ENDUniform声明
- 宏定义
#define DECLARE_SHADER_UNIFORMS_BEGIN(className)
#define DECLARE_SHADER_UNIFORMS_STRUCT_BEGIN(structName)
#define DECLARE_SHADER_UNIFORM_STRUCT_VARIABLE(variableName, variableType, initValue)
#define DECLARE_SHADER_UNIFORM_STRUCT_VARIABLE_ARRAY(variableName, variableType, arraySize, initValue)
#define DECLARE_SHADER_UNIFORM_STRUCT_STRUCT_VARIABLE(variableName, _structName)
#define DECLARE_SHADER_UNIFORM_STRUCT_STRUCT_VARIABLE_ARRAY(variableName, _structName, arraySize)
#define DECLARE_SHADER_UNIFORMS_STRUCT_END()
#define DECLARE_SHADER_UNIFORM_FIELD_BEGIN(fieldName)
#define DECLARE_SHADER_UNIFORM_FIELD_VARIABLE(variableName, variableType, initValue)
#define DECLARE_SHADER_UNIFORM_FIELD_VARIABLE_ARRAY(variableName, variableType, arraySize, initValue)
#define DECLARE_SHADER_UNIFORM_FIELD_STRUCT_VARIABLE(variableName, _structName)
#define DECLARE_SHADER_UNIFORM_FIELD_STRUCT_VARIABLE_ARRAY(variableName, _structName, arraySize)
#define DECLARE_SHADER_UNIFORM_FIELD_END(UsageType)
#define DECLARE_SHADER_UNIFORMS_END- 参数
| 参数 | 说明 |
|---|---|
| className | 类名 |
| structName | 结构体名 |
| variableName | 变量名 |
| variableType | 变量类型 |
| initValue | 初始化值 |
| _structName | 结构体名 |
| arraySize | 数组大小 |
| fieldName | 缓冲域名 |
| UsageType | 缓冲用法类型 |
- 描述
您可以通过在DECLARE_SHADER_UNIFORMS_BEGIN和DECLARE_SHADER_UNIFORMS_END中间声明UniformField来创建UniformBuffer。
您可以通过DECLARE_SHADER_UNIFORM_FIELD_VARIABLE来声明您的普通变量,通过DECLARE_SHADER_UNIFORM_FIELD_STRUCT_VARIABLE来声明结构体变量。
您可以通过DECLARE_SHADER_UNIFORMS_STRUCT_BEGIN和DECLARE_SHADER_UNIFORMS_STRUCT_END来声明自定义的结构体。
/* ----------- UNIFORMS ------------- */
DECLARE_SHADER_UNIFORMS_BEGIN(CustomUnlit)
DECLARE_SHADER_UNIFORMS_SHARED
DECLARE_SHADER_UNIFORM_FIELD_BEGIN("CustomUnlitUniforms")
DECLARE_SHADER_UNIFORM_FIELD_VARIABLE("mainTexture", EBufferFieldType::EBFT_SAMPLER, nullptr)
DECLARE_SHADER_UNIFORM_FIELD_END(EBufferUsageType::EBUT_Instanced)
DECLARE_SHADER_UNIFORMS_END反射声明
- 宏定义
#define DECLARE_SHADER_REFLECTION_BEGIN(className)
#define DECLARE_SHADER_REFLECTION_VARIABLE(reflectName, variableName, variableType)
#define DECLARE_SHADER_REFLECTION_KEYWORD(reflectName, keywordName, variableType)
#define DECLARE_SHADER_REFLECTION_END- 参数
| 参数 | 说明 |
|---|---|
| className | 类名 |
| reflectName | 反射名 |
| variableName | 变量名 |
| keywordName | 关键字名 |
| variableType | 反射类型 |
- 描述
您可以通过DECLARE_SHADER_REFLECTION_VARIABLE和DECLARE_SHADER_REFLECTION_KEYWORD来声明需要反射的变量和关键字,需要反射的关键字会根据反射状态自动插入到着色器代码中。
/* ---------------- REFLECTION ------------------ */
DECLARE_SHADER_REFLECTION_BEGIN(CustomUnlit)
DECLARE_SHADER_REFLECTION_VARIABLE("Main Color", "mainColor", MATERIAL_SHADER_REFLECTION_DEFAULT)
DECLARE_SHADER_REFLECTION_VARIABLE("Offset", "Offset", MATERIAL_SHADER_REFLECTION_DEFAULT)
DECLARE_SHADER_REFLECTION_VARIABLE("Tiling", "Tiling", MATERIAL_SHADER_REFLECTION_DEFAULT)
DECLARE_SHADER_REFLECTION_VARIABLE("Main Texture", "mainTexture", MATERIAL_SHADER_REFLECTION_DEFAULT)
DECLARE_SHADER_REFLECTION_END着色器模板介绍
内置声明
- 声明
| 声明 | 说明 |
|---|---|
| #NS_DECLARE_VERSION | 声明GLSL版本,引擎自动替换 |
| #NS_DECLARE_MULTIVIEW | 声明MultiView支持 |
| #NS_DECLARE_MULTIVIEW_NUM | 声明MultiView的视图数量 |
- 属性声明
| 声明 | 说明 |
|---|---|
| #NS_DATA_POSITION(变量名); | 声明位置变量 |
| #NS_DATA_TEXCOORD0(变量名); | 声明纹理坐标变量 |
| #NS_DATA_VERTEXCOLOR(变量名); | 声明顶点颜色变量 |
| #NS_DATA_NORMAL(变量名); | 声明法线变量 |
| #NS_DATA_TANGENT(变量名); | 声明切线变量 |
| #NS_DATA_BINORMAL(变量名); | 声明副切线变量 |
| #NS_DATA_TEXCOORD1(变量名); | 声明第二套纹理坐标变量 |
文件引用
引擎内着色器引用 对于引擎内部的着色器引用使用 #NS_INCLUDE(文件名); 的方式引用。
自定义着色器引用 对于自定义的着色器引用使用 #include “文件名” 的方式引用。
#NS_INCLUDE(Common.glsl);
#include "MaterialUniforms/CustomUnlit.glsl"材质着色器自动生成的GLSL
引擎编辑器会根据材质着色器声明的Uniform声明,自动生成对应的GLSL文件,并被顶点/片段着色器引用。
自动生成的GLSL包括预防重复引用的宏控制、共享uniforms的引用、纹理声明、缓冲声明以及InitUniforms函数声明。
需要注意的是,在材质着色器声明的变量无需在着色器中再度声明,直接使用即可。
此外,应该避免修改该文件,该文件是自动生成的,以防自定义代码被自动覆盖。
//Note: This GLSL file is generated by NibiruStudioIDE automatically, >>> DO NOT MODIFY IT <<< Create Custom GLSL File if want to add custom shader code.
#ifndef NS_MATERIAL_UNIFORMS_CustomUnlit_GLSL
#define NS_MATERIAL_UNIFORMS_CustomUnlit_GLSL
#NS_INCLUDE(MaterialUniforms/SharedUniforms.glsl);
uniform sampler2D mainTexture;
void InitUniforms()
{
#ifdef NS_ENABLE_MATERIAL_INSTANCE
InitSharedUniforms();
#endif
}
#endif // NS_MATERIAL_UNIFORMS_CustomUnlit_GLSL内置glsl介绍
Common.glsl
- 常量
| 常量 | 描述 |
|---|---|
| near | 近截面 |
| far | 远截面 |
- NSOrthoUniforms(UniformBuffer)
| 变量 | 描述 |
|---|---|
| _ViewMatrix | 正交视图矩阵 |
| _ProjMatrix | 正交投影矩阵 |
| _VPMatrix | 正交视图投影矩阵 |
- 接口
| 接口 | 说明 |
|---|---|
| Linear2Gamma | Linear转Gamma颜色 |
| Gamma2Linear | Gamma转Linear颜色 |
| LinearizeDepth | 深度线性化 |
| DepthToColor | 深度转颜色输出 |
| NSObjectToClipPos | 高效模型空间转投影空间坐标 |
| BlendSrcOneMinusSrcAlpha | 软件实现的颜色混合 |
MathCommon.glsl
- 常量
| 常量 | 描述 |
|---|---|
| NS_PI | 圆周率 |
- 宏定义
| 宏定义 | 描述 |
|---|---|
| INFINITY | INF非法值 |
| EPSILON | 误差值 |
| M_DEG_2_RAD | 角度转弧度(变量) |
| M_TO_RADIAN | 角度转弧度(宏定义计算公式) |
- 接口
| 接口 | 说明 |
|---|---|
| Square | 平方 |
| mul | 乘法 |
| saturate | 截断到0-1 |
| Pow4 | 四次方 |
| Pow5 | 五次方 |
| BlendNormals | 法线混合 |
| NS_Dot2 | 点乘 |
| NS_NDot | 对应相乘相减 |
| NS_IsNearlyEqual | 判断两个变量是否近似相等 |
| NS_QuaternionFromEulerAngle | 欧拉角转四元数 |
| NS_MatrixFromQuaternion | 四元数转旋转矩阵 |
| NS_MatrixScale | 矩阵缩放 |
| NS_MatrixTranslation | 矩阵平移 |
| NS_MatrixFromTRS | 从平移、旋转、缩放创建矩阵 |
| NS_Max3 | 三个数的最大值 |
| NS_Min3 | 三个数的最小值 |
| NS_Median3 | 三个数的中间值 |
BRDF.glsl
- 结构体——LightingIntermediateData
| 变量 | 描述 |
|---|---|
| N、H、L、V | 法线、半角向量、光照方向、视线方向 |
| distToLight | 到光源距离 |
| distToCamera | 到相机距离 |
| NoV、NoL、NoH、VoH | 法线与视线方向点乘等 |
| roughness | 粗糙度 |
| metallic | 金属度 |
| albedo | 反照率 |
| F0 | 菲涅尔项 |
| radiance | 辐照率 |
- 结构体——NS_BRDFData
| 变量 | 描述 |
|---|---|
| albedo | 反照率 |
| diffuse | 漫反射 |
| specular | 镜面反射 |
| reflectivity | 反射率 |
| perceptualRoughness | 感知粗糙度 |
| roughness | 粗糙度 |
| roughness2 | 平方粗糙度 |
| grazingTerm | 掠射角项 |
| normalizationTerm | 四方粗糙度+2 |
| roughness2MinusOne | 平方粗糙度-1 |
| clearCoat | 清漆 |
| clearCoatPerceptualRoughness | 清漆感知粗糙度 |
| clearCoatRoughness | 清漆粗糙度 |
| roughnessT | 各向异性 |
| roughnessB | 各向异性 |
- 结构体——NS_BRDFResult
| 变量 | 描述 |
|---|---|
| diffuse | 漫反射 |
| specular | 镜面反射 |
- 接口
| 接口 | 说明 |
|---|---|
| LightingPhysicallyBased | PBR光照计算 |
| DirectBRDFSpecular | 直接光BRDF |
| clearCoatBRDF | 清漆BRDF |
| standardBRDF | 标准BRDF |
| anisotropyBRDF | 各向异性BRDF |
| NS_InitializeBRDFData | 初始化BRDF数据 |
| NS_InitializeClearCoatBRDFData | 初始化清漆BRDF数据 |
| NS_InitializeBRDFDataAniso | 初始化各向异性BRDF数据 |
SH.glsl
- 结构体——NSSHData
| 变量 | 描述 |
|---|---|
| ShData | 球谐系数数据 |
- NSSHDataUniforms(UniformBuffer)
| 变量 | 描述 |
|---|---|
| _NSSHData | 球谐系数数据 |
- 常量
| 常量 | 描述 |
|---|---|
| c0 | Y00 |
| c1 | Y1-1, Y10, Y11 |
| c2 | Y2-2, Y2-1, Y21, Y22 |
| c3 | Y20 |
| c4 | Y3-3, Y3-2, Y3-1, Y31, Y32, Y33 |
- 接口
| 接口 | 说明 |
|---|---|
| Y[n] | 法线处理函数,共有9个 |
| SHEvaluate | 球谐系数评估函数 |
HDR.glsl
- 接口
| 接口 | 描述 |
|---|---|
| ReinhardToneMapping | Reinhard色调映射函数 |
| F | Filmic色调映射辅助函数 |
| Uncharted2ToneMapping | Filmic色调映射函数 |
PostProcessing.glsl
- 纹理
| 变量 | 描述 |
|---|---|
| SceneDepthSurface | 场景深度纹理 |
| DepthSurface_TexelSize | 场景深度纹理的纹素大小 |
- NSPostProcessingUniforms(UniformBuffer)
| 变量 | 描述 |
|---|---|
| _NSWorldProj | 后处理世界投影矩阵 |
- 接口
| 接口 | 描述 |
|---|---|
| GetCurrentDepth | 获取当前纹理坐标深度 |
| ComputeWorldSpacePosition | 计算当前纹理坐标的世界位置 |
Common/LogDepth.glsl
- 接口
| 接口 | 说明 |
|---|---|
| NS_HandleDepth_VS | 计算对数深度下的gl_Position |
| NS_HandleDepth_GS | 传递对数深度 |
| NS_HandleDepth_FS | 对数深度值写入gl_FragDepth |
| NS_HandleDepth_Reverse | 还原对数深度 |
Common/MultiView.glsl
| 采样器 | 描述 |
|---|---|
| NS_SCENE_SAMPLER2D | 多视图场景纹理采样器 |
| NS_SHADOW_SAMPLER2D | 多视图阴影纹理采样器 |
| NS_DEPTH_SAMPLER2D | 多视图深度纹理采样器 |
| NS_MULTIVIEW_INDEX | 多视图序号 |
| NS_SKYBOX_MVP | 多视图天空盒MVP矩阵 |
| NS_SCENE_TEXTURE | 多视图时采样场景纹理 |
| NS_SHADOW_TEXTURE | 多视图时采样阴影纹理 |
| NS_DEPTH_TEXTURE | 多视图时采样深度纹理 |
| NS_INV_PROJ_MATRIX | 多视图屏幕空间阴影计算使用的逆投影矩阵 |
| NS_INV_VIEW_MATRIX | 多视图屏幕空间阴影计算使用的逆视图矩阵 |
| NS_FXAA_TEX_LOD_OFFSET | 多视图快速近似抗锯齿纹理细节层次采样偏移 |
| NS_FXAA_TEX_LOD | 多视图快速近似抗锯齿纹理细节层次采样 |
| NS_SCENE_SHADOW_LAYER | 多视图场景阴影层 |
Common/PerCamera.glsl
- 结构体——NSCameraData
| 变量 | 描述 |
|---|---|
| NS_WorldCameraPosition | 相机世界空间位置 |
| NS_WorldCameraDirection | 相机世界空间方向 |
| NS_CameraNearAndFarDistance | 相机远近截面 |
| NS_CameraViewMatrix | 相机视图矩阵 |
| NS_CameraProjMatrix | 相机投影矩阵 |
| NS_CameraVPMatrix | 相机视图投影矩阵 |
| NS_CameraInvVPMatrix | 相机视图投影逆矩阵 |
| NS_CameraViewMatrixInLastFrame | 相机上一帧视图矩阵 |
| NS_CameraProjMatrixInLastFrame | 相机上一帧投影矩阵 |
| NS_CameraVPMatrixInLastFrame | 相机上一帧视图投影矩阵 |
| NS_CameraInvVPMatrixInLastFrame | 相机上一帧视图投影逆矩阵 |
| NS_CameraViewportSize | 相机视口大小 |
| NS_IsStereoCamera | 相机是否是立体相机 |
| NS_StereoCameraIndex | 相机的立体相机序号 |
- NSCameraUniforms(UniformBuffer)
| 变量 | 描述 |
|---|---|
| _NSCameraData | 相机数据 |
| _NSCurrentCameraIndex | 当前相机序号 |
- 宏定义
| 宏定义 | 描述 |
|---|---|
| NS_MATRIX_V | 当前相机视图矩阵 |
| NS_MATRIX_P | 当前相机投影矩阵 |
| NS_MATRIX_VP | 当前相机视图投影矩阵 |
| NS_MATRIX_InvVP | 当前相机视图投影逆矩阵 |
| NS_MATRIX_PREV_V | 当前相机上一帧视图矩阵 |
| NS_MATRIX_PREV_P | 当前相机上一帧投影矩阵 |
| NS_MATRIX_PREV_VP | 当前相机上一帧视图投影矩阵 |
| NS_MATRIX_PREV_InvVP | 当前相机上一帧视图投影逆矩阵 |
| NS_CAMERA_POSITION | 当前相机位置 |
| NS_CAMERA_DIRECTION | 当前相机方向 |
| NS_CAMERA_NEAR_DISTANCE | 当前相机近截面 |
| NS_CAMERA_FAR_DISTANCE | 当前相机远截面 |
| NS_CAMERA_ONE_OVER_LOG2_FAR _DEPTH_FROM_NEAR_PLUS_ONE | 当前相机对数深度系数 |
| NS_CAMERA_VIEWPORT_SIZE | 当前相机视口大小 |
| NS_IsStereoCamera | 当前相机是否是立体相机 |
| NS_StereoCameraIndex | 当前相机的立体相机序号 |
Common/PerFrame.glsl
- NSFrameUniforms(UniformBuffer)
| 变量 | 描述 |
|---|---|
| _NSFrameTime | 每帧更新的系统时间 |
| _NSIsXR | 是否是XR模式 |
| _NSHASIBL | 是否有IBL图 |
| _NSSHAr | IBL生成的SH系数 |
| _NSSHAg | IBL生成的SH系数 |
| _NSSHAb | IBL生成的SH系数 |
Common/PerRenderable.glsl
- NSRenderableUniforms(UniformBuffer)
| 变量 | 描述 |
|---|---|
| _NSRenderableData | 渲染对象数据 |
- 宏定义
| 宏定义 | 描述 |
|---|---|
| NS_MATRIX_M | 当前的模型矩阵 |
| NS_MATRIX_InvM | 当前的模型逆矩阵 |
| NS_MATRIX_PREV_M | 上一帧的模型矩阵 |
| NS_MATRIX_PREV_InvM | 上一帧的模型逆矩阵 |
| NS_RECEIVE_SHADOWS | 是否接收阴影 |
| NS_SH_INDEX | 当前的SH系数序号 |
Common/RenderableData.glsl
- 结构体——NSRenderableData
| 变量 | 描述 |
|---|---|
| NS_RenderableModelMatrix | Model矩阵 |
| NS_RenderableInvModelMatrix | 逆Model矩阵 |
| NS_RenderableModelMatrixInLastFrame | 上一帧Model矩阵 |
| NS_RenderableInvModelMatrixInLastFrame | 上一帧逆Model矩阵 |
| NS_RenderablePositionWS | 世界空间位置 |
| NS_ParticipateCulling | 是否参与剔除 |
| NS_RenderMask | 渲染遮罩 |
| NS_LodLevel | Lod级别 |
| NS_LODGroupIndex | Lod组序号 |
| NS_ReceiveShadow | 是否接收阴影 |
| NS_SHIndex | SH系数序号 |
| NS_CastShadow | 是否投射阴影 |
- 结构体——NSRenderObjectData
| 变量 | 描述 |
|---|---|
| meshIndex | 网格数据序号 |
| renderabelIndex | 渲染对象序号 |
| instanceCount | 实例化个数 |
| isValid | 是否有效 |
| isActive | 是否激活 |
| queueIndex | 渲染队列序号 |
Light/LightCommon.glsl
- 宏定义
| 宏定义 | 描述 |
|---|---|
| MAX_Direct_LIGHTS | 最大平行光数量 |
| MAX_Point_LIGHTS | 最大点光源数量 |
| MAX_SPOT_LIGHTS | 最大聚光灯数量 |
| MAX_AREA_LIGHTS | 最大区域光数量 |
- 结构体——DirectionalLight
| 变量 | 描述 |
|---|---|
| direction | 光照方向 |
| intensity | 光照强度 |
| color | 光照颜色 |
| specularShininess | 高光强度 |
| specularColor | 高光颜色 |
| indexInShadowArray | 阴影序号 |
| bCalSpecular | 是否计算高光 |
- 结构体——PointLight
| 变量 | 描述 |
|---|---|
| position | 光照位置 |
| intensity | 光照强度 |
| color | 光照颜色 |
| specularShininess | 高光强度 |
| attenuation | 衰减系数 |
| indexInShadowArray | 阴影序号 |
| bCalSpecular | 是否计算高光 |
| specularColor | 高光颜色 |
| range | 点光宇范围 |
- 结构体——SpotLight
| 变量 | 描述 |
|---|---|
| position | 光照位置 |
| intensity | 光照强度 |
| color | 光照颜色 |
| specularShininess | 高光强度 |
| attenuation | 衰减系数 |
| indexInShadowArray | 阴影序号 |
| bCalSpecular | 是否计算高光 |
| specularColor | 高光颜色 |
| range | 点光宇范围 |
| direction | 光照方向 |
| cutOff | 聚光灯内圆锥角度 |
| outerCutOff | 聚光灯外圆锥角度 |
- 结构体——AreaLight
| 变量 | 描述 |
|---|---|
| color | 光照颜色 |
| intensity | 光照强度 |
| points | 区域光角点 |
| position | 光照位置 |
| twoSided | 区域光是否双面渲染 |
| indexInShadowArray | 阴影序号 |
| range | 点光宇范围 |
- 结构体——NS_Light
| 变量 | 描述 |
|---|---|
| direction | 光照方向 |
| position | 光照位置 |
| color | 光照颜色 |
| distanceAttenuation | 距离衰减系数 |
| shadowAttenuation | 阴影衰减系数 |
- 结构体——PBRLigth
| 变量 | 描述 |
|---|---|
| diffuse | 漫反射 |
| specular | 镜面反射 |
| Lo | 所有光照 |
- NS_Light_UBO(UniformBuffer)
| 变量 | 描述 |
|---|---|
| NS_DirectionalLights | 所有平行光 |
| NS_PointLights | 所有点光源 |
| NS_SpotLights | 所有聚光灯 |
| NS_AreaLights | 所有区域光 |
| NS_Ambient | 环境光颜色 |
| NS_DirectionalLightCount | 平行光个数 |
| NS_PointLightCount | 点光源个数 |
| NS_SpotLightCount | 聚光灯个数 |
| NS_AreaRectLightCount | 区域光个数 |
Light/ BlinnPhongLighting.glsl
- 接口
| 接口 | 描述 |
|---|---|
| NS_BlinnPhong_CalculateDirectionalLight | BlinnPhong计算平行光 |
| NS_BlinnPhong_CalculatePointLight | BlinnPhong计算点光源 |
| NS_BlinnPhong_CalculateSpotLight | BlinnPhong计算聚光灯 |
| NS_CalculateLights | BlinnPhong计算所有光照 |
Light/ PBRLighting.glsl
- 结构体——NS_GI
| 变量 | 描述 |
|---|---|
| Diffuse | 漫反射 |
| Specular | 镜面反射 |
- 接口
| 接口 | 说明 |
|---|---|
| DistributionGGX | 法线分布函数 |
| GeometrySchlickGGX | 几何函数 |
| GeometrySmith | 环境遮蔽和光线遮蔽 |
| fresnelSchlick | 菲涅尔函数 |
| FresnelSchlickRoughness | 菲涅尔函数:Fresnel-Schlick |
| DisneyDiffuse | 迪士尼漫反射计算 |
| NS_PBRCalculateSpotLight | PBR计算聚光灯 |
| NS_PBRCalculateSpotLightMetallic | PBR计算聚光灯金属度流 |
| GetMainLight | 获取主光 |
| GetAdditionalDirectionalLightsCount | 获取额外平行光数量 |
| GetAdditionalDirectionalLights | 获取其他平行光 |
| GetAdditionalPointLightsCount | 获取额外点光源数量 |
| GetAdditionalPointLights | 获取其他点光源 |
| GetAdditionalSpotLightsCount | 获取额外聚光灯数量 |
| GetAdditionalSpotLights | 获取其他聚光灯 |
| PhysicallyBaseDirectLighting | PBR计算直接光照 |
| PhysicallyBaseAreaLightsLighting | PBR计算区域光照 |
| CalculateFinalColor | 获取最终颜色 |
| EnvironmentBRDF | 计算环境光BRDF |
| GlobalIllumination | 计算全局光照 |
| NS_UniversalFragmentPBR | PBR片段通用函数 |
| NS_PBR_AnisotropicLit | PBR计算各向异性光照 |
Shadow/ShdowCommon.glsl
- 纹理
| 纹理 | 描述 |
|---|---|
| NS_Shadow_ScreenShadowTexArray | 屏幕空间阴影纹理 |
- 接口
| 接口 | 说明 |
|---|---|
| NS_GetDirectionalLightShadowAttenuation | 获取平行光的阴影衰减系数 |
| NS_GetPointLightShadowAttenuation | 获取点光源的阴影衰减系数 |
| NS_GetSpotLightShadowAttenuation | 获取聚光灯的阴影衰减系数 |
| NS_GetAreaLightShadowAttenuation | 获取区域光的阴影衰减系数 |
GPUDrive.glsl
- 属性
| 变量 | 描述 |
|---|---|
| aBoneWeight | 骨骼的权重 |
| aBoneIndex | 骨骼的顺序 |
- 常量
| 常量 | 描述 |
|---|---|
| MAX_BONES | 最大骨骼数量 |
| MAX_BONE_INFLUENCE | 最大骨骼影响数量 |
- 结构体——NSGpuDriveData
| 变量 | 描述 |
|---|---|
| finalBonesMatrices | 最终骨骼矩阵 |
| finalBonesInvMatrices | 最终骨骼逆矩阵 |
- NSGpuDriveUniforms(StorageBuffer)
| 变量 | 描述 |
|---|---|
| _NSGpuDriveData | GPU驱动骨骼动画数据 |
- 接口
| 接口 | 说明 |
|---|---|
| NSGetVertexPosInObjectSpace | 骨骼模型顶点位置转模型空间位置 |
| NSGetNormalInObjectSpace | 骨骼模型顶点法线转模型空间法线 |
ShaderLibrary/InputData.glsl
- 结构体——NS_InputData
| 变量 | 描述 |
|---|---|
| positionWS | 世界空间位置 |
| positionCS | 裁剪空间位置 |
| normalWS | 世界空间法线 |
| viewDirectionWS | 世界空间视线方向 |
| TexCoord | 纹理坐标 |
| shadowCoord | 阴影坐标 |
| fogCoord | 雾坐标 |
| vertexLighting | 顶点光照 |
| bakedGI | 烘焙的全局光照 |
| normalizedScreenSpaceUV | 归一化的屏幕空间纹理坐标 |
| shadowMask | 阴影遮罩 |
| tangentToWorld | 切线空间转世界空间矩阵 |
ShaderLibrary/SurfaceData.glsl
- 结构体——NS_SurfaceData
| 变量 | 描述 |
|---|---|
| albedo | 反照率颜色 |
| specular | 高光颜色 |
| emission | 自发光颜色 |
| alpha | 透明度 |
| metallic | 金属度 |
| roughness | 粗糙度 |
| smoothness | 平滑度 |
| ao | 环境光遮蔽系数 |
| ambientColor | 环境光颜色 |
| normalTS | 切线空间法线 |
| normalWS | 世界空间法线 |
| tangentWS | 世界空间切线 |
| bitangentWS | 世界空间副切线 |
ShaderLibrary/SurfaceInput.glsl
- 接口
| 接口 | 说明 |
|---|---|
| Alpha | 处理alpha值并处理透明度剔除 |
| SampleMetallicSpecGloss | 采样金属度或者高光值 |
| InitializeStandardLitSurfaceData | 初始化光照标准表面数据 |
SDF/SDFCommon.glsl
- 接口
| 接口 | 说明 |
|---|---|
| NS_SDF_SDFSphere | SDF球 |
| NS_SDF_SDFTriangle | SDF三角形 |

