Точки рендеринга в цветовом пространстве HSV вместо RGB с OpenGL

В настоящее время я пытаюсь отобразить свои точки с помощью цветового пространства 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), который отображается белым, а не розовым цветом.


person Schnigges    schedule 29.01.2013    source источник


Ответы (2)


OpenGL не может отображать цвета с использованием цветового пространства HSV. Вы можете использовать только формат RGBA (или некоторые варианты, такие как SRGBA)

но не проблема использовать внутреннее цветовое пространство HSV и в конце получить значение RGBA

person fen    schedule 29.01.2013

Фактически, вы должны написать функцию преобразования HSVtoRGB. Вы передадите цвет HSV этой функции. Он преобразует цвет HSV в цвет RGB, а затем вы рисуете как RGB. Другими словами, вы будете работать в цветовом пространстве HSV внутренне, и только во время печати вы конвертируете в RGB.

person Amyr    schedule 06.07.2015