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

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

概述 订阅 步骤1 准备 shaders文件- ccShad_Hsl.h /* * cocos2d for iPhone: http://www.cocos2d-iphone.org * * Copyright (c) 2011 Brian Chapados * * Permission is hereby granted, free of charge, to any person obtainin


订阅

步骤1

准备shaders文件-ccShad_Hsl.h

/*
* cocos2d for iPhone: http://www.cocos2d-iphone.org
*
* copyright (c) 2011 Brian Chapados
* Permission is hereby granted,free of charge,to any person obtaining a copy
* of this software and associated documentation files (the "Software"),to deal
* in the Software without restriction,including without limitation the rights
* to use,copy,modify,merge,publish,distribute,sublicense,and/or sell
* copIEs of the Software,and to permit persons to whom the Software is
* furnished to do so,subject to the following conditions:
* The above copyright notice and this permission notice shall be included in
* all copIEs or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS",WITHOUT WARRANTY OF ANY KIND,EXPRESS OR
* IMPLIED,INCLUDING BUT NOT liMITED TO THE WARRANTIES OF MERCHANTABIliTY,
* fitness FOR A PARTIculaR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR copYRIGHT HolDERS BE liABLE FOR ANY CLaim,damAGES OR OTHER
* liABIliTY,WHETHER IN AN ACTION OF CONTRACT,TORT OR OTHERWISE,ARISING FROM,0)"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAliNGS IN
* THE SOFTWARE.
*/

" \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\
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\
voID main(voID)\n\
{\n\
float Cmax,Cmin;\n\
float D;\n\
float H,S,L;\n\
float R,G,B;\n\
vec4 color = texture2D(CC_Texture0,v_texCoord);\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,0)"> L = (Cmax + Cmin) / 2.0;\n\
if (Cmax == Cmin)\n\
{\n\
H = 0.0;\n\
S = 0.0;\n\
}\n\
D = Cmax - Cmin;\n\
if (L < 0.5)\n\
S = D / (Cmax + Cmin);\n\
S = D / (2.0 - (Cmax + Cmin));\n\
if (R == Cmax)\n\
H = (G - B) / D;\n\
} else {\n\
if (G == Cmax)\n\
H = 2.0 + (B - R) /D;\n\
H = 4.0 + (R - G) / D;\n\
H = H / 6.0;\n\
// modify H/S/L values\n\
H += AddHue;\n\
S += AddSat;\n\
L += Addlig;\n\
if (H < 0.0)\n\
H = H + 1.0;\n\
H = clamp(H,0.0,1.0);\n\
S = clamp(S,0)"> L = clamp(L,0)"> // convert back to RGB\n\
float var_2,var_1;\n\
if (S == 0.0)\n\
R = L;\n\
G = L;\n\
B = L;\n\
if ( L < 0.5 )\n\
var_2 = L * ( 1.0 + S );\n\
var_2 = ( L + S ) - ( S * L );\n\
var_1 = 2.0 * L - var_2;\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\
R = R * AddRed;\n\
G = G * AddGreen;\n\
B = B * AddBlue;\n\
gl_Fragcolor = vec4(R,B,color.a * AddAlpha);\n\
";


将它放入E:\HSluZiLong\cocos2d-x-2.2.1\cocos2d-x-2.2.1\cocos2dx\shaders 目录下

步骤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();

步骤3.

在CCSprite 类中 追加 HSL 接口

bool m_use_hsl;
GLfloat m_color_h m_color_s m_color_l m_color_agluint hLocation sLocation lLocation rLocation gLocation bLocation aLocation;



[cpp] view plain copy voIDinitHSL(); voIDdrawHSL(); voIDsetHSL(floath,floats,87); background-color:inherit">floatl); voIDsetH(floath); voIDsetS(floats); voIDsetL( floatgetH(voID){returnm_color_h;} floatgetS(returnm_color_s;} floatgetL(returnm_color_l;}
copy voIDCCSprite::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"); } } voIDCCSprite::drawHSL() { ccBlendFuncblend=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); #definekQuadSizesizeof(m_squad.bl) longoffset=(long)&m_squad; //vertex intdiff=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,0); background-color:inherit">//color glVertexAttribPointer(kCCVertexAttrib_color,4,GL_UNSIGNED_BYTE,GL_TRUE,248)"> glDrawArrays(GL_TRIANGLE_STRIP,4); CC_INCREMENT_GL_DRAWS(1); voIDCCSprite::setHSL(floatl) initHSL(); setH(h); setS(s); setL(l); voIDCCSprite::setH(floath) initHSL(); m_color_h=h; voIDCCSprite::setS(floats) m_color_s=s; voIDCCSprite::setL( m_color_l=l; 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.

调用接口

copy CCSprite*pSprite=CCSprite::create("Icon.png"); //-1~10无变化 pSprite->setS(-1); //positionthespriteonthecenterofthescreen pSprite->setposition(ccp(visibleSize.wIDth/2+origin.x,visibleSize.height/2+origin.y)); //addthespriteasachildtothislayer this->addChild(pSprite,0); }

|字号订阅

总结

以上是内存溢出为你收集整理的在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度全部内容,希望文章能够帮你解决在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1045410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存