常量缓冲区 CBuffer

在 Unity 中,CBuffer 是通过 HLSL 中的CBUFFER_STARTCBUFFER_END宏进行封装,背后在不同平台映射为常量缓冲区,其原理查看->[计算机图形学/HLSL/常量缓冲区 CBuffer](计算机图形学/HLSL/常量缓冲区 CBuffer)。

HLSL
CBUFFER_START(缓冲区名称)
	变量类型 _变量名;
CBUFFER_END
点击展开查看更多

各种常量缓冲区

Unity内置常量缓冲区

Unity预定义了一些内置常量缓冲区的名称,直接使用这些名称可以让Unity自动填充对应的全局变量:

HLSL
// 示例:使用内置缓冲区名称
CBUFFER_START(UnityPerDraw)
    float4x4 unity_ObjectToWorld;
    float4x4 unity_WorldToObject;
CBUFFER_END
点击展开查看更多

自定义缓冲区:材质专属变量

URP/HDRP管线中,为材质属性声明专用缓冲区时使用固定使用名称 UnityPerMaterial
这是Unity的约定,确保材质属性被正确分组优化。

HLSL
CBUFFER_START(UnityPerMaterial)
    float4 _MainTex_ST;
    float4 _Color;
    float _Glossiness;
CBUFFER_END
点击展开查看更多

完全自定义缓冲区

若无特殊需求,也可任意命名(仅限非材质属性):

HLSL
CBUFFER_START(MyCustomBuffer)
    float _CustomValue;
    int _CustomID;
CBUFFER_END
点击展开查看更多

宏定义解析

在Unity中,声明CBuffer的宏有CBUFFER_STARTCBUFFER_END,在文件Packages/com.unity.render-pipelines.core/ShaderLibrary/API/XXX.hlslXXX为图形API名称)中定义,具体定义如下:

HLSL
#define CBUFFER_START(name) cbuffer name {
#define CBUFFER_END };
点击展开查看更多

可见在Unity中定义CBuffer实际上是与HLSL等效的:

HLSL
cbuffer name {
	变量类型 _变量名;
}
点击展开查看更多

不过值得注意的是在API GLES2中该宏定义为空,意味着在GLES2中使用该宏定义CBuffer会降级为普通的Uniform,即Built-In的写法。可见Unity之所以整出这两个宏,不过是为了兼容GLES2罢了。

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/%E5%B8%B8%E9%87%8F%E7%BC%93%E5%86%B2%E5%8C%BA-cbuffer/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键