加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮

发布时间:2020-12-14 19:54: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 flo

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
elsen
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
elsen
{n
D = Cmax - Cmin;n
if (L < 0.5)n
{n
S = D / (Cmax + Cmin);n
}n
elsen
{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
elsen
{n
H = 4.0 + (R - G) / D;n
}n
}n
H = H / 6.0;n
}n
n
// modify H/S/L valuesn
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,1.0);n
L = clamp(L,1.0);n
n
// convert back to RGBn
float var_2,var_1;n
n
if (S == 0.0)n
{n
R = L;n
G = L;n
B = L;n
}n
elsen
{n
if ( L < 0.5 )n
{n
var_2 = L * ( 1.0 + S );n
}n
elsen
{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,H );n
B = Hue_2_RGB( var_1,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,B,color.a * AddAlpha);n
n
}n
";


将它放入E:HSluZiLongcocos2d-x-2.2.1cocos2d-x-2.2.1cocos2dxshaders 目录下

步骤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 接口

[cpp] view plain copy
  1. boolm_use_hsl;
  2. GLfloatm_color_h;
  3. GLfloatm_color_s;
  4. GLfloatm_color_l;

GLfloat m_color_a;

GLuint hLocation;
GLuint sLocation;
GLuint lLocation;
GLuint rLocation;
GLuint gLocation;
GLuint bLocation;
GLuint aLocation;


copy
    voidinitHSL();
  1. voiddrawHSL();
  2. voidsetHSL(floath,floats,87); font-weight:bold; background-color:inherit">floatl);
  3. voidsetH(floath);
  4. voidsetS(floats);
  5. voidsetL(floatl);
  6. floatgetH(void){returnm_color_h;}
  7. floatgetS(returnm_color_s;}
  8. floatgetL(returnm_color_l;}

copy
    voidCCSprite::initHSL()
  1. {
  2. if(m_use_hsl==false)
  3. m_use_hsl=true;
  4. setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(KCCShader_Position_hsl));
  5. hLocation=glGetUniformLocation(getShaderProgram()->getProgram(),"AddHue");
  6. sLocation=glGetUniformLocation(getShaderProgram()->getProgram(),"AddSat");
  7. lLocation=glGetUniformLocation(getShaderProgram()->getProgram(),"AddLig");
  8. rLocation=glGetUniformLocation(getShaderProgram()->getProgram(),"AddRed");
  9. gLocation=glGetUniformLocation(getShaderProgram()->getProgram(),"AddGreen");
  10. bLocation=glGetUniformLocation(getShaderProgram()->getProgram(),"AddBlue");
  11. aLocation=glGetUniformLocation(getShaderProgram()->getProgram(),"AddAlpha");
  12. }
  13. }
copy
    voidCCSprite::drawHSL()
  1. ccBlendFuncblend=getBlendFunc();
  2. ccGLBlendFunc(blend.src,blend.dst);
  3. getShaderProgram()->use();
  4. getShaderProgram()->setUniformsForBuiltins();
  5. getShaderProgram()->setUniformLocationWith1f(hLocation,m_color_h);
  6. getShaderProgram()->setUniformLocationWith1f(sLocation,m_color_s);
  7. getShaderProgram()->setUniformLocationWith1f(lLocation,m_color_l);
  8. getShaderProgram()->setUniformLocationWith1f(rLocation,_displayedColor.r/255.f);
  9. getShaderProgram()->setUniformLocationWith1f(gLocation,_displayedColor.g/255.f);
  10. getShaderProgram()->setUniformLocationWith1f(bLocation,_displayedColor.b/255.f);
  11. m_color_a=this->getOpacity()/255.f;
  12. getShaderProgram()->setUniformLocationWith1f(aLocation,m_color_a);
  13. ccGLBindTexture2D(getTexture()->getName());
  14. ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex);
  15. #definekQuadSizesizeof(m_sQuad.bl)
  16. longoffset=(long)&m_sQuad;
  17. //vertex
  18. intdiff=offsetof(ccV3F_C4B_T2F,vertices);
  19. glVertexAttribPointer(kCCVertexAttrib_Position,3,GL_FLOAT,GL_FALSE,kQuadSize,(void*)(offset+diff));
  20. //texCoods
  21. diff=offsetof(ccV3F_C4B_T2F,texCoords);
  22. glVertexAttribPointer(kCCVertexAttrib_TexCoords,2,0); background-color:inherit">//color
  23. glVertexAttribPointer(kCCVertexAttrib_Color,4,GL_UNSIGNED_BYTE,GL_TRUE,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> glDrawArrays(GL_TRIANGLE_STRIP,4);
  24. CC_INCREMENT_GL_DRAWS(1);
  25. }
  26. voidCCSprite::setHSL(floatl)
  27. initHSL();
  28. setH(h);
  29. setS(s);
  30. setL(l);
  31. voidCCSprite::setH(floath)
  32. {
  33. initHSL();
  34. m_color_h=h;
  35. voidCCSprite::setS(floats)
  36. m_color_s=s;
  37. voidCCSprite::setL(floatl)
  38. m_color_l=l;
  39. if(m_color_l>0)
  40. blend.src=GL_SRC_ALPHA;
  41. else
  42. blend.src=GL_ONE;
  43. blend.dst=GL_ONE_MINUS_SRC_ALPHA;
  44. setBlendFunc(blend);
  45. }


在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.

调用接口

copy
    {
  1. CCSprite*pSprite=CCSprite::create("Icon.png");
  2. //-1~10无变化
  3. pSprite->setS(-1);
  4. //positionthespriteonthecenterofthescreen
  5. pSprite->setPosition(ccp(visibleSize.width/2+origin.x,visibleSize.height/2+origin.y));
  6. //addthespriteasachildtothislayer
  7. this->addChild(pSprite,0);
  8. }






















(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读