本文以 Cocos2d-x 3.x 的 Lua API 为例,说明自定义 Shader 的组成、加载方式和默认纹理着色器结构。
什么是着色器?
在计算机图形学领域,着色器(Shader)是一类运行在 GPU 上的程序。它最初主要用于光照和阴影计算,现在也广泛用于颜色处理、模糊、描边等屏幕后期效果。
Cocos2d-x 中的 Shader
Cocos2d-x 3.x 的移动端渲染通常使用 OpenGL ES Shading Language。GLSL 语法不在本文展开,可参考 OpenGL ES 入口 和 GLSL ES 1.00 规范。
引擎中的可渲染节点都依赖着色器。例如,Sprite 使用适合 2D 纹理渲染的程序,Sprite3D 使用面向 3D 渲染的程序。Cocos2d-x 自带的常用 Shader 位于 frameworks\cocos2d-x\cocos\renderer 目录。
加载并应用自定义 Shader
为节点设置 GLProgramState:
1 | sprite:setGLProgramState(programState) |
programState 关联由顶点(vert)着色器和片元(frag)着色器组成的 GLProgram。既可以通过已注册名称加载,也可以从 Lua 字符串创建:
1 | -- 通过已注册名称加载 Shader |
getOrCreateWithGLProgram 可能返回共享的状态对象。如果同一个 GLProgram 用在多个节点上,而各节点需要不同的 uniform 值,应为节点创建或克隆独立的 GLProgramState,避免相互覆盖。
顶点与片元着色器结构
下面是 Cocos2d-x 默认纹理着色器的精简结构:
1 | // cocos2dx源码中 ccShader_PositionTextureColor.vert |