Mark~
HSV and HLS color systems are problematic for a number of reasons. I talked with a color scientist about this recently, and his recommendation was to convert to YIQ or YCbCr space and adjust the the chroma channels (I&Q, or Cb&Cr) accordingly. (You can learn how to do that here and here.)
Once in one of those spaces, you can get the hue from the angle formed by the chroma channels, by doing hue = atan(cr/cb) (watching for cb == 0). This gives you a value in radians. Simply rotate it by adding the hue rotation amount. Once you've done that, you can calculate the magnitude of the chroma with chroma = sqrt(cr*cr+cb*cb). To get back to RGB, calculate the new Cb and Cr (or I & Q) using Cr = chroma * sin (hue), Cb = chroma * cos (hue). Then convert back to RGB as described on the above web pages.
EDIT: Here's a solution that I've tested and seems to give me the same results as your reference. You can probably collapse some of the dot products into matrix multiplies:
uniform sampler2DRect inputTexture;
uniform float hueAdjust;
void main ()
{
const vec4 kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0);
const vec4 kRGBToI = vec4 (0.596, -0.275, -0.321, 0.0);
const vec4 kRGBToQ = vec4 (0.212, -0.523, 0.311, 0.0);
const vec4 kYIQToR = vec4 (1.0, 0.956, 0.621, 0.0);
const vec4 kYIQToG = vec4 (1.0, -0.272, -0.647, 0.0);
const vec4 kYIQToB = vec4 (1.0, -1.107, 1.704, 0.0);
// Sample the input pixel
vec4 color = texture2DRect (inputTexture, gl_TexCoord [ 0 ].xy);
// Convert to YIQ
float YPrime = dot (color, kRGBToYPrime);
float I = dot (color, kRGBToI);
float Q = dot (color, kRGBToQ);
// Calculate the hue and chroma
float hue = atan (Q, I);
float chroma = sqrt (I * I + Q * Q);
// Make the user's adjustments
hue += hueAdjust;
// Convert back to YIQ
Q = chroma * sin (hue);
I = chroma * cos (hue);
// Convert back to RGB
vec4 yIQ = vec4 (YPrime, I, Q, 0.0);
color.r = dot (yIQ, kYIQToR);
color.g = dot (yIQ, kYIQToG);
color.b = dot (yIQ, kYIQToB);
// Save the result
gl_FragColor = color;
}
引用
http://stackoverflow.com/questions/9234724/how-to-change-hue-of-a-texture-with-glsl
分享到:
相关推荐
本篇文章将深入探讨如何在Cocos2dx 2.x中应用Shader,并通过提供的FKCocos2dxEffectDemo实例进行详细解析。 首先,理解Shader的概念至关重要。Shader是运行在GPU上的小型程序,负责计算物体表面的颜色、光照等视觉...
在本文中,我们将深入探讨如何利用IntelliJ IDEA,一个备受赞誉的Java集成开发环境,通过安装并使用“cocos-intellij-plugin”插件,提升Cocos2d-js的开发效率。 首先,我们要明确“cocos-intellij-plugin-2.0.0-...
高斯模糊是一种图像模糊滤波器,它用正态分布计算图像中每个像素的变换。
总的来说,这个“cocos-2d回合制游戏”项目是一个很好的学习和实践Cocos-2d游戏开发的实例。通过研究其代码和设计,开发者不仅可以了解Cocos-2d引擎的使用,还能深入理解回合制游戏的开发流程和设计原则。无论你是...
《cocos2d-0.99.4-x-0.7.1.zip:深入了解Cocos2D游戏引擎的历史与应用》 Cocos2D是一款开源的游戏开发框架,以其高效、易用和跨平台的特性在游戏开发者中享有广泛声誉。这个名为"cocos2d-0.99.4-x-0.7.1.zip"的...
Cocos2d-x 2.X实现的一基于CCLabelTTF + Shader的字体描边效果,具体可以参考这篇博客,http://blog.csdn.net/oktears/article/details/43200757
cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...
本教程将详细讲解如何使用Shader将紫色替换为灰色,同时也会涉及Shader的基本概念和Cocos2d-x中的Shader应用。 首先,让我们了解什么是Shader。Shader是一种在GPU(图形处理器)上运行的程序,它处理图像渲染过程中...
Cocos2d-x是一个流行的开源跨平台2D游戏开发框架,用C++编写,支持多种操作系统,包括iOS、Android、Windows等。在这个场景中,我们关注的是如何在Cocos2d-x项目中实现一个二维码控件。二维码(Quick Response Code...
cocos2d-x进阶教程1_1搭建和配置Lua开发...cocos2d-x进阶教程1_7LuaTable使用2.mp4 cocos2d-x进阶教程1_8LuaTable使用3.mp4 cocos2d-x进阶教程1_9LuaTable读写数据文件.mp4 cocos2d-x进阶教程1_10在Lua中实现串行化.mp4
在本篇内容中,我们将深入探讨“我所理解的cocos2dx pdf”这一主题,通过对标题、描述以及部分关联内容的分析,提取并总结出关于Cocos2dx的重要知识点。 ### Cocos2d-x 概览 #### 1. Cocos2d-x 是什么? Cocos2d-x...
这个“Cocos2d-X游戏源码大合集.rar”文件显然包含了大约三十个使用Cocos2d-X开发的游戏实例源代码,对于学习和理解Cocos2d-X游戏开发的原理、技巧以及实践应用具有极大的价值。 1. **Cocos2d-X基础**: Cocos2d-X...
标签“cocos”和“cocos2dx”分别代表了cocos系列框架和cocos2d-x这个特定的分支。cocos2d-x不仅适用于游戏开发,还可以用于创建教育软件、互动媒体和其他2D图形应用,其强大的场景管理、精灵(Sprite)系统和粒子...
在游戏开发领域,Cocos2d-x 是一个广泛使用的开源跨平台2D游戏引擎,而 Lua 是一种轻量级的脚本语言,常被用作 Cocos2d-x 的脚本接口,即 Cocos2d-lua。在这个场景下,“cocos2d-lua 实现富文本”意味着我们要探讨...
它基于Python的Cocos2D,提供了丰富的功能,如场景管理、动作效果、精灵动画等,使得开发者能够快速构建高质量的游戏应用。这份源码库"lhunath-Cocos2D-iPhone.old-9ab3d34"为我们提供了一个深入理解Cocos2D-iPhone...
cocos2dx3.x_shader仅供学习
Quick-Cocos2dx-Community 3.6.5版本发布说明是Cocos2d-x社区的一个重要里程碑,这个版本包含了官方支持的热更新功能以及其他一些关键的改进和演示项目。Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,并...
Cocos2d-x 是一款跨平台的2D游戏开发框架,广泛应用于游戏开发。这个压缩包 "kbengine-cocos2dx-cocos2dx-consoft.zip" 显然是将 KBEngine 引擎与 Cocos2d-x 框架结合的示例项目,帮助开发者了解如何在 Cocos2d-x ...
在iOS游戏开发领域,Cocos2D-iPhone是一个广受欢迎的开源框架,它为开发者提供了创建2D游戏、教育应用、演示和其他互动内容的强大工具。这个压缩包"lhunath-Cocos2D-iPhone.old-9ab3d34.zip"包含了由开发者lhunath...
精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发