LUT 查找表
LUT 可以用于后处理中的颜色矫正,它能将一个 RGB 颜色唯一地映射到另一个颜色。
它是一个三维的颜色查找表,但图形渲染中,由于图形 API 通常并不支持三维纹理的查找,所以我们会将三维 LUT 展开成二维的形式。
下图是一个标准的 16 * 256 LUT,每个 Block 由16*16 个像素组成。像素内使用 RG 通道索引,Block 通过 B 通道索引。
需要注意的是,这个 LUT 的原点是在左上角的,Vulkan 和 DX 的纹理坐标默认也是左上角,而 OpenGL 在计算 UV 的时候要将 V 坐标翻转一下。
实现
RGB 的色彩空间是 255 * 255 * 255,而 LUT 的色彩空间远小于此,因此在设置纹理的时候需要将纹理的 Filter 设置为线性插值以上。
VkSamplerCreateInfo samplerInfo {
};
samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
samplerInfo.magFilter = VK_FILTER_LINEAR;
samplerInfo.minFilter = VK_FILTER_LINEAR;
R 通道和 G 通道实际上是一个 Block 内的 偏移,Block 之间通过 B 通道索引。
具体的 Shader 代码如下:
#version 310 es