🐻GPUImage3笔记:ShaderUniformSettings

1,486 阅读2分钟

本熊前言:此文帮助理解GPUImage3,之前对ShaderUniformSettings比较困惑!

我从GPUImage3中开了个分支,目的是为GPUImage3添加中文注释,同时学习Metal。目前完成了Base、Inputs部分,欢迎有兴趣者一起加入,添加中文注释。

地址:(欢迎Star✨)GPUImageByMetal

在GPUImage3中ShaderUniformSettings可能比较难以理解,这个类要与shader有联系、与渲染管线有联系、与滤镜实现部分依旧有联系,想要自定义滤镜,这个类必须吃透才行。uniform这个可能有点疑惑,在Metal、OpenGL中是一致的,只能在片段着色器中使用,具体请看本文分析。

本文将翻译ShaderUniformSettings.swift文件。

一、从名字上来看:

名字的意思是着色器统一配置,这个若是第一次看是没什么感觉的,应该和着色器有关系。

二、从内容上来看:

public subscript(key:String) -> Float
public subscript(key:String) -> Color
public subscript(key:String) -> Position
public subscript(key:String) -> Size
public subscript(key:String) -> Matrix3x3
public subscript(key:String) -> Matrix4x4

Subscript access 下角标访问,swift特性,可以定义在类(Class)、结构体(structure)和枚举(enumeration)

我们可以知道ShaderUniformSettings存的就是这些东西FloatColorPositionSizeMatrix3x3Matrix4x4

三、从使用上来看:

  • yuvConversionVideoRangeFragment 中的 YUVConversionUniform
  • thresholdFragment 中的 ThresholdUniform
  • brightnessFragment 中的 BrightnessUniform
  • exposureFragment 中的 ExposureUniform
  • contrastFragment 中的 ContrastUniform
  • ······

很多fragmentshader都使用了者个变量uniform,且是有共性的:

总结

综上,我们可以推断出,uniform是用于标记可控制的,即值可以改变的且存在于Fragment中的变量。

如调节滤镜的浓度、亮度、灰度等可调节的值,这种值的类型可以是FloatColorPositionSizeMatrix3x3Matrix4x4.以后你如果想通改变shader中的值,那么请使用uniform

ShaderUniformSettings就是负责记录查找这些属性的。

具体可见代码库分析。

如果你想参与翻译一些知名代码仓库,请加我微信,备注翻译哦。

加V备注:掘金;入群一起学习🐻