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

Render Points in HSV color space instead of RGB with OpenGL

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

我的片段着色器如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 const GLchar *fragment_shader2 =
"#version 330\
"
""
"/* 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),显示为白色而不是粉红色。


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

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


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