[已解决]Lua中使用openGL shader时,Scale9Sprite无法变灰色

参考
偶尔e网事的js代码:http://www.cocoachina.com/bbs/read.php?tid=197691


–将精灵变灰
@param #cc.Sprite sprite
function SpriteSetGray(sprite)
if sprite then
if GrayProgram == nil then
local program = cc.GLProgram:create(“res/gray.vsh”, “res/gray.fsh”)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS)
program:link()
program:updateUniforms()
GrayProgram = program
end
sprite:setGLProgram(GrayProgram)
end
end

发现对于Scale9Sprite无法变灰,求解

因为Scale9Sprite不是一个sprite而是一个node

@偶尔e网事

嗯,确实。背景是Scale9Sprite时,不知道怎么变灰

为什么我这样用会工具直接停止工作呢

gray.vsh, gray.fsh
能否把这个贴出来看下

提供一个思路:不确定是否正确。

Scale9Sprite 实际上是在给定的 sprite 中建立10个child sprites 用来进行布局。你可以通过 sprite:getChildren() 来获得这些 child sprites

然后对这些 child sprites 也同样 sprite:setGLProgram 一遍

感觉这样就可以工作起来了

我按照你的思路测试了下,结果是:什么都不显示。

–将9精灵变灰
@function Scale9SpriteSetGray
@param #cc.Scale9Sprite sprite9

function Scale9SpriteSetGray(sprite9)
if sprite9 then
if GrayProgram == nil then
local program = cc.GLProgram:create(“res/gray.vsh”, “res/gray.fsh”)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS)
program:link()
program:updateUniforms()
GrayProgram = program
end
if GrayProgram then
local children = sprite9:getChildren()
if children and #children > 0 then
for _, aSprite in ipairs(children) do
cclog(“XXX”)
aSprite:setGLProgram(GrayProgram)
end
end
end
end
end

已经解决了,只要判定一下子node的setGLProgram方法有没有就可以—
–将9精灵变灰
@function Scale9SpriteSetGray
@param #cc.Scale9Sprite sprite9

function Scale9SpriteSetGray(sprite9)
if sprite9 then
if GrayProgram == nil then
local program = cc.GLProgram:create(“res/gray.vsh”, “res/gray.fsh”)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR)
program:bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS)
program:link()
program:updateUniforms()
GrayProgram = program
end
if GrayProgram then
local children = sprite9:getChildren()
if children and #children > 0 then
for _, aSprite in ipairs(children) do
cclog(“XXX”)
if aSprite.setGLProgram then
aSprite:setGLProgram(GrayProgram)
end
end
end
end
end
end
回复

求楼主的gray.vsh和gray.fsh文件 我的错误cocos2d: ERROR: Failed to compile shader:

gray.fsh :

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform sampler2D CC_Texture0;

void main()
{
vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}

gray.vsh

attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}

九切是不行的,你只需要设置一下 他的BatchNode节点的shader就可以了
因为他的渲染是放在 batchNode来设置的
对节点设置 shader的话需要遍历节点
Sprite和BatchNode的节点都需要设置,shader。

发现 scale9 的 位置会偏移呀

我发现ImageView 也是Scale9
但是shader上去没反应来着。
请教下怎么实现呢。

— Begin quote from ____

引用第8楼imyp2635于2014-09-28 17:02发表的 回 6楼(good-day) 的帖子 :
已经解决了,只要判定一下子node的setGLProgram方法有没有就可以—
–将9精灵变灰
@function Scale9SpriteSetGray
@param #cc.Scale9Sprite sprite9

http://www.cocoachina.com/bbs/job.php?action=topost&tid=225922&pid=1066438

— End quote

我想问一下 local children = sprite9:getChildren()
if children and #children > 0 then

在获得#children的大小的时候,#children为0,这样无法为每一个子结点设置shader。这种情况遇到过么?谢谢

c++源码里将protectedChildren返回出来,对它进行遍历就行了,看一下源码就知道了

你好,请问你说的C++是哪个文件的哪个方法呀?

你好,请问一下,该如何设置你说batchNode和Sprite的shader