使用OpenGL在HSV颜色空间中渲染点而不是RGB

时间:2013-01-29 15:03:09

标签: opengl colors shader rgb hsv

我正在尝试使用HSV色彩空间渲染我的点。为此,我在片段着色器中使用了一个函数,生成了正确的转换向量。 现在我的问题是如何告诉OpenGL它应该将此向量解释为HSV颜色而不是RGB颜色。

我的片段着色器看起来像这样:

 const GLchar *fragment_shader2 =
 "#version 330\n"
 ""
 "/* Output Variables */"
 "out vec4 out_color;"
 ""
 "/* Function Prototypes */"
 "vec3 convertRGBtoHSV(vec3 rgbColorVector);"
 ""
 "void main()"
 "{"
 "  vec3 rgbColor = vec3(1.0, 0.0, 0.55);"
 "  "
 "  out_color = vec4(convertRGBtoHSV(rgbColor), 1.0);"
 "}"
 ""
 "vec3 convertRGBtoHSV(vec3 rgbColorVector)"
 "{"
 "  vec3 hsvColorVector = vec3(0.0, 0.0, 0.0);"
 "  float maxValue = max(rgbColorVector.r, max(rgbColorVector.g, rgbColorVector.b));"
 "  float minValue = min(rgbColorVector.r, min(rgbColorVector.g, rgbColorVector.b));"
 "  "
 "  /* Set Value */"
 "  hsvColorVector[2] = maxValue;"
 "  "
 "  /* Set Saturation */"
 "  if(maxValue != 0.0)"
 "  {"
 "      hsvColorVector[1] = (maxValue - minValue) / maxValue;"
 "  }"
 "  "
 "  /* Set Hue */"
 "  float hue = 0.0;"
 "  if(maxValue == rgbColorVector.r)"
 "  {"
 "      hue = (0.0 + (rgbColorVector.g - rgbColorVector.b) / (maxValue - minValue)) * 60.0;"
 "  }"
 "  else if(maxValue == rgbColorVector.g)"
 "  {"
 "      hue = (2.0 + (rgbColorVector.b - rgbColorVector.r) / (maxValue - minValue)) * 60.0;"
 "  }"
 "  else if(maxValue == rgbColorVector.b)"
 "  {"
 "      hue = (4.0 + (rgbColorVector.r - rgbColorVector.g) / (maxValue - minValue)) * 60.0;"
 "  }"
 "  "
 "  if(hue < 0.0)"
 "  {"
 "      hue = hue + 360.0;"
 "  }"
 "  "
 "  hsvColorVector[0] = hue / 360.0;"
 "  "
 "  /* Return converted color vector */"
 "  return hsvColorVector;"
 "}"
 "\0";

在此示例中,输出为vec3(0.908,1.0,1.0),显示为白色而不是粉红色。

2 个答案:

答案 0 :(得分:4)

OpenGL无法使用HSV色彩空间显示颜色。 您只能使用RGBA格式(或某些变体,如SRGBA)

但在内部使用HSV色彩空间并且最后产生RGBA值

不是问题

答案 1 :(得分:0)

实际上,你应该编写HSVtoRGB转换函数。您将HSV颜色传递给此功能。它会将HSV颜色转换为RGB颜色,然后绘制为RGB。 换句话说,您将在内部使用HSV色彩空间,并且仅在绘制时,您将转换为RGB。