在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度
来源:互联网 发布:企业淘宝开店流程图解 编辑:程序博客网 时间:2024/05/17 04:17
http://blog.csdn.net/hsluzilong/article/details/17447453
步骤1.
准备 shaders文件- ccShad_Hsl.h
" \n\
#ifdef GL_ES \n\
precision mediump float; \n\
#endif \n\
\n\
varying vec2 v_texCoord; \n\
uniform sampler2D CC_Texture0; \n\
\n\
uniform float AddHue; \n\
uniform float AddSat; \n\
uniform float AddLig; \n\
uniform float AddRed; \n\
uniform float AddGreen; \n\
uniform float AddBlue; \n\
uniform float AddAlpha; \n\
\n\
float Hue_2_RGB(float v1, float v2, float vH ) \n\
{ \n\
float ret;\n\
if ( vH < 0.0 )\n\
vH += 1.0;\n\
if ( vH > 1.0 )\n\
vH -= 1.0;\n\
if ( ( 6.0 * vH ) < 1.0 )\n\
ret = ( v1 + ( v2 - v1 ) * 6.0 * vH );\n\
else if ( ( 2.0 * vH ) < 1.0 )\n\
ret = ( v2 );\n\
else if ( ( 3.0 * vH ) < 2.0 )\n\
ret = ( v1 + ( v2 - v1 ) * ( ( 2.0 / 3.0 ) - vH ) * 6.0 );\n\
else\n\
ret = v1;\n\
return ret;\n\
}\n\
\n\
void main(void)\n\
{\n\
float Cmax, Cmin;\n\
\n\
float D;\n\
\n\
float H, S, L;\n\
float R, G, B;\n\
\n\
vec4 color = texture2D(CC_Texture0, v_texCoord);\n\
\n\
R = color.r;\n\
G = color.g;\n\
B = color.b;\n\
Cmax = max (R, max (G, B));\n\
Cmin = min (R, min (G, B));\n\
L = (Cmax + Cmin) / 2.0;\n\
\n\
if (Cmax == Cmin)\n\
{\n\
H = 0.0;\n\
S = 0.0;\n\
}\n\
else\n\
{\n\
D = Cmax - Cmin;\n\
if (L < 0.5)\n\
{\n\
S = D / (Cmax + Cmin);\n\
}\n\
else\n\
{\n\
S = D / (2.0 - (Cmax + Cmin));\n\
}\n\
\n\
if (R == Cmax)\n\
{\n\
H = (G - B) / D;\n\
} else {\n\
if (G == Cmax)\n\
{\n\
H = 2.0 + (B - R) /D;\n\
}\n\
else\n\
{\n\
H = 4.0 + (R - G) / D;\n\
}\n\
}\n\
H = H / 6.0;\n\
}\n\
\n\
// modify H/S/L values\n\
H += AddHue;\n\
S += AddSat;\n\
L += AddLig;\n\
\n\
if (H < 0.0)\n\
{\n\
H = H + 1.0;\n\
}\n\
\n\
H = clamp(H, 0.0, 1.0);\n\
S = clamp(S, 0.0, 1.0);\n\
L = clamp(L, 0.0, 1.0);\n\
\n\
// convert back to RGB\n\
float var_2, var_1;\n\
\n\
if (S == 0.0)\n\
{\n\
R = L;\n\
G = L;\n\
B = L;\n\
}\n\
else\n\
{\n\
if ( L < 0.5 )\n\
{\n\
var_2 = L * ( 1.0 + S );\n\
}\n\
else\n\
{\n\
var_2 = ( L + S ) - ( S * L );\n\
}\n\
\n\
var_1 = 2.0 * L - var_2;\n\
\n\
R = Hue_2_RGB( var_1, var_2, H + ( 1.0 / 3.0 ) );\n\
G = Hue_2_RGB( var_1, var_2, H );\n\
B = Hue_2_RGB( var_1, var_2, H - ( 1.0 / 3.0 ) );\n\
}\n\
\n\
R = R * AddRed;\n\
G = G * AddGreen;\n\
B = B * AddBlue;\n\
\n\
gl_FragColor = vec4(R,G,B, color.a * AddAlpha);\n\
\n\
}\n\
";
步骤2.
在 ccShaders.h 中加入代码
extern CC_DLL const GLchar * ccPositionColorHSL_frag;
extern CC_DLL const GLchar * ccPositionColorHSL_vert;
在 ccShaders.cpp 中加入代码
const GLchar * ccPositionColorHSL_frag =
#include "ccShad_Hsl.h"
在 CCGLProgram.h 中定义
#define KCCShader_Position_hsl "KCCShader_Position_hsl"
在 CCShaderCache.cpp 中 追加枚举 kCCShaderType_Position_hsl,
在 CCShaderCache.cpp 的 reloadDefaultShaders中加入代码
p = programForKey(KCCShader_Position_hsl);
p->reset();
loadDefaultShader(p, kCCShaderType_Position_hsl);
在 CCShaderCache.cpp 的 loadDefaultShader 中加入代码
case kCCShaderType_Position_hsl:
p->initWithVertexShaderByteArray(ccPositionTextureColor_vert, ccPositionColorHSL_frag);
p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
break;
在 CCShaderCache.cpp 的 loadDefaultShaders中加入代码
p = new CCGLProgram();
loadDefaultShader(p, kCCShaderType_Position_hsl);
m_pPrograms->setObject(p, KCCShader_Position_hsl);
p->release();
if(this->m_use_hsl)
{
m_use_hsl = false;
initHSL();
}
步骤3.
在 CCSprite 类中 追加 HSL 接口
- bool m_use_hsl;
- GLfloat m_color_h;
- GLfloat m_color_s;
- GLfloat m_color_l;
GLfloat m_color_a;
GLuint hLocation;
GLuint sLocation;
GLuint lLocation;
GLuint rLocation;
GLuint gLocation;
GLuint bLocation;
GLuint aLocation;
- void initHSL();
- void drawHSL();
- void setHSL(float h, float s, float l);
- void setH(float h);
- void setS(float s);
- void setL(float l);
- float getH(void){ return m_color_h;}
- float getS(void){ return m_color_s;}
- float getL(void){ return m_color_l;}
- void CCSprite::initHSL()
- {
- if(m_use_hsl == false)
- {
- m_use_hsl = true;
- setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(KCCShader_Position_hsl));
- hLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddHue");
- sLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddSat");
- lLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddLig");
- rLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddRed");
- gLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddGreen");
- bLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddBlue");
- aLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddAlpha");
- }
- }
- void CCSprite::drawHSL()
- {
- ccBlendFunc blend = getBlendFunc();
- ccGLBlendFunc(blend.src, blend.dst);
- getShaderProgram()->use();
- getShaderProgram()->setUniformsForBuiltins();
- getShaderProgram()->setUniformLocationWith1f(hLocation, m_color_h);
- getShaderProgram()->setUniformLocationWith1f(sLocation, m_color_s);
- getShaderProgram()->setUniformLocationWith1f(lLocation, m_color_l);
- getShaderProgram()->setUniformLocationWith1f(rLocation, _displayedColor.r/255.f);
- getShaderProgram()->setUniformLocationWith1f(gLocation, _displayedColor.g/255.f);
- getShaderProgram()->setUniformLocationWith1f(bLocation, _displayedColor.b/255.f);
- m_color_a = this->getOpacity() / 255.f;
- getShaderProgram()->setUniformLocationWith1f(aLocation, m_color_a);
- ccGLBindTexture2D( getTexture()->getName());
- ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex );
- #define kQuadSize sizeof(m_sQuad.bl)
- long offset = (long)&m_sQuad;
- // vertex
- int diff = offsetof( ccV3F_C4B_T2F, vertices);
- glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));
- // texCoods
- diff = offsetof( ccV3F_C4B_T2F, texCoords);
- glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));
- // color
- diff = offsetof( ccV3F_C4B_T2F, colors);
- glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- CC_INCREMENT_GL_DRAWS(1);
- }
- void CCSprite::setHSL(float h, float s, float l)
- {
- initHSL();
- setH(h);
- setS(s);
- setL(l);
- }
- void CCSprite::setH(float h)
- {
- initHSL();
- m_color_h = h;
- }
- void CCSprite::setS(float s)
- {
- initHSL();
- m_color_s = s;
- }
- void CCSprite::setL(float l)
- {
- initHSL();
- m_color_l = l;
- ccBlendFunc blend = getBlendFunc();
- if(m_color_l > 0)
- blend.src = GL_SRC_ALPHA;
- else
- blend.src = GL_ONE;
- blend.dst = GL_ONE_MINUS_SRC_ALPHA;
- setBlendFunc(blend);
- }
在 CCSprite.cpp 的 updateBlendFunc中追加代码
if(m_use_hsl)
{
ccBlendFunc blend = getBlendFunc();
if(m_color_l > 0)
blend.src = GL_SRC_ALPHA;
else
blend.src = GL_ONE;
blend.dst = GL_ONE_MINUS_SRC_ALPHA;
setBlendFunc(blend);
}
在 CCSprite.cpp 的 setTexture中追加代码
if(this->m_use_hsl)
{
m_use_hsl = false;
initHSL();
}
在 CCSprite.cpp 的 draw 开头插入代码
if(m_use_hsl)
{
drawHSL();
return;
}
步骤5.
调用接口
- {
- CCSprite* pSprite = CCSprite::create("Icon.png");
- // -1 ~ 1 0无变化
- pSprite->setS(-1);
- // position the sprite on the center of the screen
- pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
- // add the sprite as a child to this layer
- this->addChild(pSprite, 0);
- }
- 在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度
- 在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度
- 在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度
- HSL(色调,饱和度,亮度)
- HSL 色调饱和度亮度关系
- 色调、饱和度和亮度 HSL
- 颜色HSL(色调,饱和度,亮度)
- 颜色HSL(色调,饱和度,亮度)
- 色调、亮度和饱和度
- 色调,饱和度,亮度如何计算
- 色调,饱和度,亮度如何计算
- 色调,饱和度,亮度如何计算
- 图像处理中色调、亮度、饱和度的定义
- 图像处理中色调、亮度、饱和度的定义
- 图像处理中色调、亮度、饱和度的定义
- 关于颜色HSL(色度、饱和度、亮度)
- 关于颜色HSL(色度、饱和度、亮度)
- 关于颜色HSL(色度、饱和度、亮度)
- 将一个十六进制字符串转换为十进制数值的问题
- 互联网网站的反爬虫策略浅析
- CentOS的生命周期
- jquery wrap,wrapAll,wrapInner 区别:
- 二值图像--形态学处理2 腐蚀和膨胀
- 在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度
- 实战:sqlserver 2012 扩展事件-XML转换为标准的table格式v1
- linux命令------cat命令
- 如何用Data Recovery Wizard 来恢复被格式化的硬盘中的数据
- 20、DS18B20实验
- Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)
- 点滴记录——CentOS 6.4中使用virtualenv安装swift
- Xcode6中如何对scrollview进行自动布局(autolayout)
- 高效剔除某一功能