1

現在、HSV色空間を使用してポイントをレンダリングしようとしています。これを行うには、フラグメントシェーダーの関数を使用して、正しい変換ベクトルを生成します。ここで私の質問は、OpenGLにこのベクトルをRGBカラーではなくHSVカラーとして解釈するように指示する方法です。

私のフラグメントシェーダーは次のようになります。

 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 に答える