【问题标题】:How to render color gradients that start from one side to other side in opengl?如何在opengl中渲染从一侧到另一侧的颜色渐变?
【发布时间】:2012-09-26 07:25:53
【问题描述】:

我想渲染从一侧到另一侧的颜色渐变。如图所示,颜色渐变从最小边界框开始到最大边界框。代码如下。

Point c = (VERTICES[i] - min) / (max - min);
p_COLOR[i].setRGB(c.red, c.green, c.blue);

这里的问题是,颜色渐变不遵循任何方向(例如从下到上:下侧有红色和蓝紫色两种颜色)。但我需要应用从 -x 到 x 或 -y 到 y 或 -z 到 z 的渐变,这意味着如果红色从 -y 开始,那么只有红色覆盖 -y 侧区域,然后通过将渐变从 -y 移动到 y , 以红后蓝后绿后黄等递增颜色。下边不应该有红色和蓝紫色,必须只有红色然后向上移动到蓝色然后绿色等等。

我该怎么做?方程是什么?

【问题讨论】:

  • 可能想查看HSV color space,并将您的渐变定义为色调。听起来它比 RGB 更符合这个描述。不过方程式有点复杂。
  • 希望对您有所帮助:stackoverflow.com/questions/10361569/…
  • 感谢@Tim 我已经转换并列出了 HSL 颜色。 for(int i=0; i

标签: opengl opengl-es rendering texture-mapping opengl-3


【解决方案1】:

您的解决方案非常简单,但非常有限。如果您希望渐变仅应用于一个轴,则应仅使用 VERTICES 结构的一个组件(我假设 VERTICES[i] 保存当前顶点的位置)。将您的代码分成两部分:

梯度函数

vec3 Gradient (float param) 
{
    param = clamp(param, 0, 1);

    // we are treating these colors as HSL now:
    vec3 ColorA (0, 0.5, 0.5);
    vec3 ColorB (1, 0.5, 0.5);

    // so now we need to convert them to plain old RGB
    // note how the blending equation remains the same
    return HSL2RGB(param * ColorA + (1-param) * ColorB); // simple blending equation
}

着色功能

float c = ((VERTICES[i] - min) / (max - min)).x; // or y,z
p_COLOR[i].setRGB(Gradient(c));

着色器在普通的 GLSL 中,所以请原谅我对 ES 的无知。

【讨论】:

  • 感谢@Bartek,您的代码运行良好。但它只用两种颜色(colorA 和 colorB)绘制渐变。但我想用四种颜色绘制渐变。 R G B Y. 我用这个方法来转换 HSL2RGB 并在 temp 中列出颜色。 for(int i=0; i
  • 您不需要列表。我添加了HSL2RGB(我认为它本身可以正常工作)
  • 现在可以完美运行了。谢谢。您能否告诉我如何从渐变中删除一种颜色。我想从渐变中删除粉红色。总颜色将是 4 或 5 种而不是 6 种。当我从 HSL2RGB 函数中删除一种颜色时,删除的颜色区域会变成没有颜色的黑色。我希望删除的颜色区域应该由以前的颜色填充,并且渐变看起来很好用 4 种颜色。谢谢。
  • 你可以投票/接受我的回答,只是说。你现在问的有点复杂。尝试摆弄Gradient 函数和ColorA/ColorB;我不想苛刻,但我已经花了大约一个小时的时间来回答这个问题。
  • @furqan:如果您还有其他问题,请发布另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多