Quick-Cocos2d-x 3.2将对象(包括子对象)变灰的方法

前端之家收集整理的这篇文章主要介绍了Quick-Cocos2d-x 3.2将对象(包括子对象)变灰的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

先上效果图:

灰化效果

参考:Cocos2d-x让精灵图像变灰的方法

但这个方法在Quick-Cocos2d-x3.2(下面简称QC)下不能完美实现变灰效果-变灰了的对象的位置会跳到屏幕右上角。


百思不得其解,搜一下有没有人发现这个问题,果然有:

关于Sprite的setShaderProgram后坐标改变的问题发现4楼的仁兄的回复有亮点:如何在Cocos2d-x 3.0中使用opengl shader?

点进去一看,内容是这样的:

“坐标变化的解决了,将附件gray.vsh 中的CC_MVPMatrix 改为 CC_PMatrix 即可 ”

我估计应该是位置转换的矩阵问题吧,gray.vsh是什么下面会说到。

经过分析,发现原因在addGray方法Cocos2d-x 让精灵图像变灰的方法)的27行:

1 @H_301_47@
pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert,pszFragSource); @H_301_47@ @H_301_47@
@H_301_47@ @H_301_47@

ccPositionTextureColor_vert是什么呢?它存放在cocos/renderer下,名为ccShader_PositionTextureColor.vert。它的作用是……以在下的理解,是一个shader方法(ccShader),关于位置、材质与颜色的(PositionTextureColor)且是针对顶点的(.vert)。


它的内容是:

1 @H_301_47@
2 @H_301_47@
3 @H_301_47@
4 @H_301_47@
5 @H_301_47@
6 @H_301_47@
7 @H_301_47@
8 @H_301_47@
9 @H_301_47@
10 @H_301_47@
11 @H_301_47@
12 @H_301_47@
13 @H_301_47@
14 @H_301_47@
15 @H_301_47@
16 @H_301_47@
17 @H_301_47@
18 @H_301_47@
19 @H_301_47@
ccShader_PositionTextureColor.vert @H_301_47@
const char *ccPositionTextureColor_vert=STRINGIFY( @H_301_47@
attributevec4a_position; @H_301_47@
attributevec2a_texCoord; @H_301_47@
attributevec4a_color; @H_301_47@
\n#ifdefGL_ES\n @H_301_47@
varyinglowpvec4v_fragmentColor; @H_301_47@
varyingmediumpvec2v_texCoord; @H_301_47@
\n# else \n @H_301_47@
varyingvec4v_fragmentColor; @H_301_47@
varyingvec2v_texCoord; @H_301_47@
\n#endif\n @H_301_47@
void main() @H_301_47@
{ @H_301_47@
gl_Position=CC_MVPMatrix*a_position; @H_301_47@
v_fragmentColor=a_color; @H_301_47@
v_texCoord=a_texCoord; @H_301_47@
} @H_301_47@
); @H_301_47@ @H_301_47@
@H_301_47@ @H_301_47@

咦,发现有一个熟悉的面孔-“CC_MVPMatrix”。其实上面说到的gray.vsh的内容就是ccShader_PositionTextureColor.vert大括号括住的部分。那我将ccShader_PositionTextureColor.vert的CC_MVPMatrix改为CC_PMatrix是否就能解决灰化后对象的位置问题呢?答案是否定的,这样改会影响其他对象(例如文本)的定位。


那我再定义一个GLchar传到pProgram->initWithVertexShaderByteArray的第一个参数不就得咯?

1 @H_301_47@
2 @H_301_47@
3 @H_301_47@
4 @H_301_47@
5 @H_301_47@
6 @H_301_47@
7 @H_301_47@
8 @H_301_47@
9 @H_301_47@
10 @H_301_47@
11 @H_301_47@
12 @H_301_47@
13 @H_301_47@
14 @H_301_47@
15 @H_301_47@
16 @H_301_47@
17 @H_301_47@
18 @H_301_47@
const GLchar*pszVertSource= @H_301_47@
"attributevec4a_position;\n\ @H_301_47@
attributevec2a_texCoord;\n\ @H_301_47@
attributevec4a_color;\n\ @H_301_47@
\n#ifdefGL_ES\n\n\ @H_301_47@
varyinglowpvec4v_fragmentColor;\n\ @H_301_47@
varyingmediumpvec2v_texCoord;\n\ @H_301_47@
\n# else \n\n\ @H_301_47@
varyingvec4v_fragmentColor;\n\ @H_301_47@
varyingvec2v_texCoord;\n\ @H_301_47@
\n#endif\n\n\ @H_301_47@
void main()\n\ @H_301_47@
{\n\ @H_301_47@
gl_Position=CC_PMatrix*a_position;\n\ @H_301_47@
v_fragmentColor=a_color;\n\ @H_301_47@
v_texCoord=a_texCoord;\n\ @H_301_47@
}"; @H_301_47@
pProgram->initWithVertexShaderByteArray(pszVertSource,pszFragSource); @H_301_47@ @H_301_47@
@H_301_47@ @H_301_47@

经实践证实是可行的。其实有个更简单的方法,就是:

1 @H_301_47@
pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_noMVP_vert,pszFragSource); @H_301_47@ @H_301_47@
@H_301_47@ @H_301_47@

原来cocos/renderer下有个文件叫ccShader_PositionTextureColor_noMVP.vert,我是怎么发现的,各位脑补一下。


最后附上实现灰化功能的全部代码

C++部分,将此方法导出给Lua用:

CUtil.cpp

1 @H_301_47@
2 @H_301_47@
3 @H_301_47@
4 @H_301_47@
5 @H_301_47@
6 @H_301_47@
7 @H_301_47@
8 @H_301_47@
9 @H_301_47@
10 @H_301_47@
11 @H_301_47@
12 @H_301_47@
13 @H_301_47@
14 @H_301_47@
15 @H_301_47@
16 @H_301_47@
17 @H_301_47@
18 @H_301_47@
19 @H_301_47@
20 @H_301_47@
21 @H_301_47@
22 @H_301_47@
23 @H_301_47@
24 @H_301_47@
25 @H_301_47@
26 @H_301_47@
void setGray(Node*node) @H_301_47@
{ @H_301_47@
USING_NS_CC; @H_301_47@
do @H_301_47@
{ @H_301_47@
const GLchar*pszFragSource= @H_301_47@
"#ifdefGL_ES\n\ @H_301_47@
precisionmediump float ;\n\ @H_301_47@
#endif\n\ @H_301_47@
uniformsampler2Du_texture;\n\ @H_301_47@
varyingvec2v_texCoord;\n\ @H_301_47@
varyingvec4v_fragmentColor;\n\ @H_301_47@
void main( void )\n\ @H_301_47@
{\n\ @H_301_47@
//ConverttogreyscaleusingNTSCweightings\n\ @H_301_47@
vec4col=texture2D(u_texture,v_texCoord);\n\ @H_301_47@
float grey=dot(col.rgb,vec3(0.299,0.587,0.114));\n\ @H_301_47@
gl_FragColor=vec4(grey,grey,col.a);\n\ @H_301_47@
}"; @H_301_47@
@H_301_47@
GLProgram*pProgram= new GLProgram(); @H_301_47@
pProgram->initWithByteArrays(ccPositionTextureColor_noMVP_vert,pszFragSource); @H_301_47@
node->setGLProgram(); @H_301_47@
CHECK_GL_ERROR_DEBUG(); @H_301_47@
} while (0); @H_301_47@
} @H_301_47@ @H_301_47@
@H_301_47@ @H_301_47@

Lua部分:DisplayUtil.lua

1 @H_301_47@
2 @H_301_47@
3 @H_301_47@
4 @H_301_47@
5 @H_301_47@
6 @H_301_47@
7 @H_301_47@
8 @H_301_47@
9 @H_301_47@
10 @H_301_47@
11 @H_301_47@
12 @H_301_47@
13 @H_301_47@
14 @H_301_47@
15 @H_301_47@
16 @H_301_47@
17 @H_301_47@
18 @H_301_47@
19 @H_301_47@
20 @H_301_47@
21 @H_301_47@
22 @H_301_47@
23 @H_301_47@
24 @H_301_47@
25 @H_301_47@
26 @H_301_47@
27 @H_301_47@
28 @H_301_47@
29 @H_301_47@
30 @H_301_47@
31 @H_301_47@
32 @H_301_47@
33 @H_301_47@
34 @H_301_47@
35 @H_301_47@
36 @H_301_47@
37 @H_301_47@
38 @H_301_47@
39 @H_301_47@
40 @H_301_47@
41 @H_301_47@
42 @H_301_47@
43 @H_301_47@
44 @H_301_47@
45 @H_301_47@
46 @H_301_47@
47 @H_301_47@
48 @H_301_47@
49 @H_301_47@
50 @H_301_47@
51 @H_301_47@
52 @H_301_47@
53 @H_301_47@
54 @H_301_47@
55 @H_301_47@
56 @H_301_47@
57 @H_301_47@
58 @H_301_47@
59 @H_301_47@
60 @H_301_47@
61 @H_301_47@
62 @H_301_47@
63 @H_301_47@
64 @H_301_47@
65 @H_301_47@
66 @H_301_47@
67 @H_301_47@
68 @H_301_47@
69 @H_301_47@
70 @H_301_47@
71 @H_301_47@
72 @H_301_47@
73 @H_301_47@
74 @H_301_47@
75 @H_301_47@
76 @H_301_47@
77 @H_301_47@
78 @H_301_47@
79 @H_301_47@
80 @H_301_47@
81 @H_301_47@
82 @H_301_47@
83 @H_301_47@
84 @H_301_47@
85 @H_301_47@
86 @H_301_47@
87 @H_301_47@
88 @H_301_47@
89 @H_301_47@
90 @H_301_47@
--不进行灰化的对象特有的方法 @H_301_47@
DisplayUtil.LIST_DONT_GRAY={ @H_301_47@
"getSprite" ,--ProgressTimer @H_301_47@
"setString" ,--Label @H_301_47@
} @H_301_47@
--判断能否灰化 @H_301_47@
functionDisplayUtil.canGray(node) @H_301_47@
for i,vinipairs(DisplayUtil.LIST_DONT_GRAY) do @H_301_47@
if node[v]then @H_301_47@
return false @H_301_47@
end @H_301_47@
end @H_301_47@
return true @H_301_47@
end @H_301_47@
--灰化对象 @H_301_47@
functionDisplayUtil.setGray(node,v) @H_301_47@
if type(node)~= "userdata" then @H_301_47@
printError( "nodemustbeauserdata" ) @H_301_47@
return @H_301_47@
end @H_301_47@
if v==nilthen @H_301_47@
v= true @H_301_47@
end @H_301_47@
if notnode.__isGray__then @H_301_47@
node.__isGray__= false @H_301_47@
end @H_301_47@
if v==node.__isGray__then @H_301_47@
return @H_301_47@
end @H_301_47@
if vthen @H_301_47@
if DisplayUtil.canGray(node)then @H_301_47@
--调用C++的setGray方法 @H_301_47@
setGray(tolua.cast(node, "cocos2d::Node" )) @H_301_47@
-- @H_301_47@
--localglProgram=node:getGLProgram() @H_301_47@
--node:setGLProgram(glProgram) @H_301_47@
--node:getGLProgram():bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION,cc.VERTEX_ATTRIB_POSITION) @H_301_47@
--node:getGLProgram():bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR,cc.VERTEX_ATTRIB_COLOR) @H_301_47@
--node:getGLProgram():bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD,cc.VERTEX_ATTRIB_TEX_COORDS) @H_301_47@
--不知道为什么下面2行一定要写 @H_301_47@
node:getGLProgram():link() @H_301_47@
node:getGLProgram():updateUniforms() @H_301_47@
end @H_301_47@
--children @H_301_47@
localchildren=node:getChildren() @H_301_47@
if childrenandtable.nums(children)>0then @H_301_47@
--遍历子对象设置 @H_301_47@
for i,vinipairs(children) do @H_301_47@
if DisplayUtil.canGray(v)then @H_301_47@
DisplayUtil.setGray(v) @H_301_47@
end @H_301_47@
end @H_301_47@
end @H_301_47@
else @H_301_47@
DisplayUtil.removeGray(node) @H_301_47@
end @H_301_47@
node.__isGray__=v @H_301_47@
end @H_301_47@
--取消灰化 @H_301_47@
functionDisplayUtil.removeGray(node) @H_301_47@
if type(node)~= "userdata" then @H_301_47@
printError( "nodemustbeauserdata" ) @H_301_47@
return @H_301_47@
end @H_301_47@
if notnode.__isGray__then @H_301_47@
return @H_301_47@
end @H_301_47@
if DisplayUtil.canGray(node)then @H_301_47@
localglProgram=cc.GLProgramCache:getInstance():getGLProgram( @H_301_47@
"ShaderPositionTextureColor_noMVP" ) @H_301_47@
node:setGLProgram(glProgram) @H_301_47@
--glProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION,cc.VERTEX_ATTRIB_POSITION) @H_301_47@
--glProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR,cc.VERTEX_ATTRIB_COLOR) @H_301_47@
--glProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD,cc.VERTEX_ATTRIB_TEX_COORDS) @H_301_47@
--不知道为什么下面2行不能写,写了会出问题 @H_301_47@
--glProgram:link() @H_301_47@
--glProgram:updateUniforms() @H_301_47@
end @H_301_47@
--children @H_301_47@
localchildren=node:getChildren() @H_301_47@
if childrenandtable.nums(children)>0then @H_301_47@
--遍历子对象设置 @H_301_47@
for i,vinipairs(children) do @H_301_47@
if DisplayUtil.canGray(v)then @H_301_47@
DisplayUtil.removeGray(v) @H_301_47@
end @H_301_47@
end @H_301_47@
end @H_301_47@
node.__isGray__= false @H_301_47@
end @H_301_47@ @H_301_47@
@H_301_47@ @H_301_47@

怎么使用不用我多说了吧。


来源网址:http://evamango-blog.logdown.com/posts/243059-quick-cocos-32-methods-to-make-object-gray

猜你在找的Cocos2d-x相关文章