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。