2015-08-05 2 views
2

Я хочу использовать GLSL Shader в своей игре cocos2d-x, которая должна сделать спрайт ярче.GLSL HSV Shader

Вот мой шейдер:

#ifdef GL_ES 
precision mediump float; 
#endif 

varying vec4 v_fragmentColor; 
varying vec2 v_texCoord; 

vec3 rgb2hsv(vec3 c) 
{ 
    vec4 K = vec4(0.0, -1.0/3.0, 2.0/3.0, -1.0); 
    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); 
    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); 

    float d = q.x - min(q.w, q.y); 
    float e = 1.0e-10; 
    return vec3(abs(q.z + (q.w - q.y)/(6.0 * d + e)), d/(q.x + e), q.x); 
} 

vec3 hsv2rgb(vec3 c) 
{ 
    vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0); 
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); 
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); 
} 

void main(void) 
{ 
    vec4 c = texture2D(CC_Texture0, v_texCoord); 
    vec4 final = c; 

    vec3 rgb = vec3(c.r, c.g, c.b); 
    vec3 hsv = rgb2hsv(rgb); 
    hsv.z = min(hsv.z + 1.0, 255.0); //HERE IS HOW MUCH BRIGHTNESS SHOULD BE ADDED 
    vec3 nrgb = hsv2rgb(hsv); 

    final.r = nrgb.x; 
    final.g = nrgb.y; 
    final.b = nrgb.z; 

    gl_FragColor = final; 
} 

RGB ВПГ и наоборот взяты отсюда: http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl

Вот изображение с "0" (добавляется hsv.z = мин (hsv.z + 0,0, 255,0);):

no brightness

Ничего не изменилось, и что ожидается. Он убеждает преобразования.

Теперь вот изображение с "1" сложение (hsv.z = мин (hsv.z + 1,0, 255,0);):

little brightness

Таким образом, это должно быть только немного немного ярче, но он выглядит так же, как на снимке экрана. Изменение «1» до, например, «10» сделает изображение чисто белым.

Я знаю, что где-то есть улов, но я не могу понять, что случилось.

+3

Компоненты 'gl_FragColor' VEC взяты из '0' в '1'. Точно так же вывод 'texture2D' находится в одном диапазоне (если вы не используете специальные форматы текстур). Строка 'min (hsv.z + 1.0, 255.0);' заставляет меня думать, что вы ожидаете, что значения будут от '0' до' 255'. –

ответ

1

Как @ColonelThirtyTwo говорит, что значения RGB и HSV присутствуют в диапазоне [0, 1].

Так что ваш код должен быть:

void main(void) 
{ 
    vec4 c = texture2D(CC_Texture0, v_texCoord); 
    vec3 hsv = rgb2hsv(c.rgb); 

    hsv.z = clamp(hsv.z + 0.05, 0.0, 1.0); // Add 1/20 of brightness. 

    gl_FragColor = hsv2rgb(hsv); 
} 
+0

Это сработало, спасибо! void main (void) { \t vec4 c = texture2D (CC_Texture0, v_texCoord); vec3 hsv = rgb2hsv (c.rgb); hsv.z = зажим (hsv.z + 0,3, 0,0, 1,0); vec3 nrgb = hsv2rgb (hsv); \t gl_FragColor = vec4 (nrgb.x, nrgb.y, nrgb.z, c.a); } – Makalele