1

我目前正在尝试使用 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),显示为白色而不是粉红色。

4

2 回答 2

4

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

但是在内部使用 HSV 颜色空间并最终产生 RGBA 值是没有问题的

于 2013-01-29T15:05:45.477 回答
0

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

于 2015-07-06T12:43:28.960 回答