quick中通过lua直接调用GL API使精灵变灰

晚上无事在研究lua直接调用GL的API来使用shader让精灵变灰,然后发现了一篇帖子,copy过来测试了下,果然可以,原帖在此
http://www.superyyl.com/?p=267
我只是做了搬运,然后稍微添加了一个恢复的按钮,最终代码如下:

function MainScene:ctor()
    self.btn = cc.ui.UIPushButton.new("ui_btn_start.png")
        :onButtonClicked(function(event)
        if not self.dark then
            self.dark = true
            self:darkNode(self.sp)
        else
            self.dark = false
            self.sp:setGLProgramState(cc.GLProgramState:getOrCreateWithGLProgram(cc.GLProgramCache:getInstance():getGLProgram("ShaderPositionTextureColor_noMVP")))
        end
                end)
        :pos(display.cx, display.cy)
        :addTo(self)
    self.sp = display.newSprite("ui_btn_start.png"):addTo(self)
    self.sp:setPosition(display.cx, 300)
    self.dark = false
end

function MainScene:darkNode(node)
    local vertDefaultSource = "\n"..
    "attribute vec4 a_position; \n" ..
    "attribute vec2 a_texCoord; \n" ..
    "attribute vec4 a_color; \n"..                                                    
    "#ifdef GL_ES  \n"..
    "varying lowp vec4 v_fragmentColor;\n"..
    "varying mediump vec2 v_texCoord;\n"..
    "#else                      \n" ..
    "varying vec4 v_fragmentColor; \n" ..
    "varying vec2 v_texCoord;  \n"..
    "#endif    \n"..
    "void main() \n"..
    "{\n" ..
    "gl_Position = CC_PMatrix * a_position; \n"..
    "v_fragmentColor = a_color;\n"..
    "v_texCoord = a_texCoord;\n"..
    "}"
    
    local pszFragSource = "#ifdef GL_ES \n" ..
    "precision mediump float; \n" ..
    "#endif \n" ..
    "varying vec4 v_fragmentColor; \n" ..
    "varying vec2 v_texCoord; \n" ..
    "void main(void) \n" ..
    "{ \n" ..
    "vec4 c = texture2D(CC_Texture0, v_texCoord); \n" ..
    "gl_FragColor.xyz = vec3(0.4*c.r + 0.4*c.g +0.4*c.b); \n"..
    "gl_FragColor.w = c.w; \n"..
    "}"

    local pProgram = cc.GLProgram:createWithByteArrays(vertDefaultSource,pszFragSource)
    
    pProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION,cc.VERTEX_ATTRIB_POSITION)
    pProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR,cc.VERTEX_ATTRIB_COLOR)
    pProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD,cc.VERTEX_ATTRIB_FLAG_TEX_COORDS)
    pProgram:link()
    pProgram:updateUniforms()
    node:setGLProgram(pProgram)
end



```


点击按钮来切换精灵的状态
再次感谢原文的作者
1赞

这是好东西啊

这个好 必须mark

测试无效啊 不知道为什么?

cpp-tests中有shaderTest可使用shader代码来完成变灰的功能啊,lua想要用的话改一下引擎源码,把那些功能输出给lua使用应该也就可以了,

你说的跟我写的有啥关系么

之前也 整过这个, 优化后:

local vertDefaultSource = 

                       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 pszFragSource = 

             #ifdef GL_ES 
                              precision mediump float;
                        #endif 
                        varying vec4 v_fragmentColor; 
                        varying vec2 v_texCoord; 

                        void main(void) 
                        { 
                            vec4 c = texture2D(CC_Texture0, v_texCoord);
                            gl_FragColor.xyz = vec3(0.4*c.r + 0.4*c.g +0.4*c.b);
                            gl_FragColor.w = c.w; 
                        }

                        ]]

local pProgram = cc.GLProgram:createWithByteArrays(vertDefaultSource, pszFragSource)

pProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION)
pProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR)
pProgram:bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_FLAG_TEX_COORDS)
pProgram:link()
pProgram:updateUniforms()
node:setGLProgram(pProgram)

神贴,mark:6::6::6::6::6::6:

刀哥威武:3:

非常不错。急需中。

感谢楼主 分享