我正在尝试使用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),显示为白色而不是粉红色。
答案 0 :(得分:4)
OpenGL无法使用HSV色彩空间显示颜色。 您只能使用RGBA格式(或某些变体,如SRGBA)
但在内部使用HSV色彩空间并且最后产生RGBA值
不是问题答案 1 :(得分:0)
实际上,你应该编写HSVtoRGB转换函数。您将HSV颜色传递给此功能。它会将HSV颜色转换为RGB颜色,然后绘制为RGB。 换句话说,您将在内部使用HSV色彩空间,并且仅在绘制时,您将转换为RGB。