cocos2dx v3.3final sprite变灰

本文介绍如何在Cocos2d-x V3.3final版本中实现图片的灰度显示效果。通过创建新的着色器文件并修改片段着色器(.frag)来达到灰度显示的目的。详细步骤包括添加新文件、修改现有源代码文件以及如何启用和禁用灰度效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章:

http://www.cnblogs.com/slysky/p/3949718.html

http://my.oschina.net/u/1430085/blog/191673

 

 cocos2d-x版本:V3.3 final

 

主要思路:根据普通图片使用的渲染方式SHADER_NAME_POSITION_TEXTURE_COLOR进行改编,坐标一样,我们只需要修改其颜色控制,即.frag文件即可。


具体如下:

一、新建一个文件ccShader_PositionTextureGray.frag存放于\cocos2d\cocos\renderer

 

//ccShader_PositionTextureGray.frag
const char* ccPositionTextureGray_frag  = STRINGIFY(
\n#ifdef GL_ES\n
precision lowp float;
\n#endif\n

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

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);
}
);

二、ccShaders.h中添加

extern CC_DLL const GLchar *ccPositionTextureGray_frag;

三、ccShaders.cpp中添加中添加

#include "ccShader_PositionTextureGray.frag"
 

四、CCGLProgram.h中添加

static constchar* SHADER_NAME_POSITION_TEXTURE_GRAY;
 

五、CCGLProgram.cpp中添加

const char*GLProgram::SHADER_NAME_POSITION_TEXTURE_GRAY = "ShaderPositionTextureGray";
 

六、CCGLProgramCache.cpp中添加

 

1、添加枚举

enum {
	………
	kShaderType_3DSkinPositionNormalTex,
	kCCShaderType_PositionTextureGray,//新增
	kShaderType_MAX,
};


2、修改函数loadDefaultGLPrograms()

{
        p = newGLProgram();
        loadDefaultGLProgram(p,kCCShaderType_PositionTextureGray);
        _programs.insert(std::make_pair(GLProgram::SHADER_NAME_POSITION_TEXTURE_GRAY, p));
}

 

3、修改函数reloadDefaultGLPrograms()

{
	…………. 
	//追加
	p =getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_GRAY);
        p->reset();
        loadDefaultGLProgram(p,kCCShaderType_PositionTextureGray);
}


4、修改loadDefaultGLProgram(GLProgram *p,inttype)

{
         ………………
	case kCCShaderType_PositionTextureGray:
             p->initWithByteArrays(ccPositionTextureColor_vert,ccPositionTextureGray_frag);
             break;
         …………………
}
 

七、使用方法

 

//设置为灰度
void addSpriteGray(ESprite*sprite)
{
    if(sprite)
    {
    	sprite->setGLProgram(cocos2d::GLProgramCache::getInstance()->getGLProgram(cocos2d::GLProgram::SHADER_NAME_POSITION_TEXTURE_GRAY));
    }
}
//移除灰度正常显示
void removeSpriteGray(ESprite* sprite)
{
    if(sprite)
    {
         sprite->setGLProgram(cocos2d::GLProgramCache::getInstance()->getGLProgram(cocos2d::GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值