实现目标
传递颜色变量到Shader,使图片渲染出不同的颜色,如下:
如何定义变量与赋值
shader中定义变量,使用关键字 uniform
修饰变量,然后通过setUniformXXX('key',value)
的方式对变量进行赋值。
支持变量类型
类型 |
设置方法 |
备注 |
int |
setUniformInt(k, v) |
1-4个整型变量 |
ivec2, ivec3, ivec4 |
|
|
float |
setUniformFloat(k, v) |
1-4个浮点数 |
vec2, vec3, vec4 |
setUniformVec2(k, v) |
|
bool |
setUniformTexture(k, v) |
|
?? |
setUniformFloatv() |
未知 |
?? |
setUniformVec2v() |
未知 |
?? |
setUniformVec3v() |
未知 |
?? |
setUniformVec4v() |
未知 |
完整代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| local vert = [[ attribute vec4 a_position; attribute vec2 a_texCoord; attribute vec4 a_color; #ifdef GL_ES varying lowp vec4 v_fragmentColor; varying mediump vec2 v_texCoord; #else varying vec4 v_fragmentColor; varying vec2 v_texCoord; #endif void main() { gl_Position = CC_PMatrix * a_position; v_fragmentColor = a_color; v_texCoord = a_texCoord; } ]]
local frag = [[ #ifdef GL_ES precision mediump float; #endif varying vec4 v_fragmentColor; varying vec2 v_texCoord;
uniform vec3 color_v3;
void main(void) { vec4 c = texture2D(CC_Texture0, v_texCoord); // 透明度大于0就改变颜色 if(c.a > 0) { gl_FragColor.rgb = color_v3; gl_FragColor.a = c.a; } else { gl_FragColor = c; } } ]]
local glProgram = cc.GLProgram:createWithByteArrays(vert, frag) local glProgramState = cc.GLProgramState:getOrCreateWithGLProgram(glProgram)
glProgramState:setUniformVec3("color_v3", cc.vec3(0.7, 0.61, 0.85))
local logo = self.holder:getChildByName("Sprite_start_logo") local size = logo:getTexture():getContentSizeInPixels()
logo:setGLProgramState(glProgramState)
|