Why?
较新的着色器模型对纹理系统进行了优化,明确区分了纹理资源与采样器状态,使纹理操作更灵活可控。
- 旧版语法使用 sampler2D、tex2D() 和类似函数。此语法适用于所有平台 -> [2D 纹理(Built-In)](/posts/2D 纹理(Built-In))
- DX10+ 语法使用 Texture2D、SamplerState 和
.Sample()函数 -> 计算机图形学/HLSL/纹理|纹理 为了兼容新旧平台,Unity 提供了预处理器宏来帮助管理这些差异,即TEXTURE2D、SAMPLER、SAMPLE_TEXTURE2D等,具体定义在文件Packages/com.unity.render-pipelines.core\ShaderLibrary\API\XXX.hlsl(XXX为图形API名称)中。
注意
声明绑定和纹理变换与Built-In渲染管线一致,参考:[2D 纹理(Built-In)](/posts/2D 纹理(Built-In)#声明与绑定)、[2D 纹理(Built-In)](/posts/2D 纹理(Built-In)#纹理变换 _XXX _ST)
TEXTUREXX
新平台定义:(定义Texture对象)
#define TEXTURE2D(textureName) Texture2D textureName
#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName
#define TEXTURECUBE(textureName) TextureCube textureName
#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName
#define TEXTURE3D(textureName) Texture3D textureName旧平台定义(GLES2):(使用sampler2D变量)
#define TEXTURE2D(textureName) sampler2D textureName
#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // 不支持texture2DArray
#define TEXTURECUBE(textureName) samplerCUBE textureName
#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // 不支持textureCubeArray
#define TEXTURE3D(textureName) sampler3D textureNameSAMPLER
新平台定义:(定义SamplerState对象)
#define SAMPLER(samplerName) SamplerState samplerName
#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName旧平台定义(GLES2) 为空,因为其纹理资源和采样器状态并不分离。
SAMPLE_TEXTUREXX
中间弯弯绕绕的,就以SAMPLE_TEXTURE2D为例:
- 新平台:(调用对应对象的
Sample函数)
#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)
#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)- 旧平台:(调用
tex2D函数)
#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)
#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)