ПрограммированиеФорум2D графика и изометрия

glColor*() устанавливает цвет неправильно

#0
20:07, 17 мар 2010

Кропаю потихоньку на C# + Tao Framework компонент для отображения всяческих данных. Задачка простая - выводить данные в виде таблицы, графиков, гистограмм. Соответственно, никакого 3Д.
Столкнулся с такой ситуацией - когда я задаю цвет функцией Gl.glColor*(...), он задается как хочет, а не как мне надо.
В частности, glColor3f нормально задает Red, Blue, Yelow, Cyan, Magenta, Black и еще несколько цветов. Все остальные превращаются в белый либо в какой-то еще, но только не тот, что был задан. Например, красный задается правильно, а вместо Green я получаю откровенный Lime.
А вот функции glColor3i, glColor4i, glColor3b, glColor4b - просто любой цвет превращают в черный.

На всякий случай приведу немного кода:

// инициализация графики
private void InitGlut()
{
  Glut.glutInit();
  Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

  Gl.glClearColor(this.BackColor.R, this.BackColor.G, this.BackColor.B, 1);
  InitViewPort();

  // создание кириллического шрифта
  GL_RU_TEXT.BuildFont(16, "courier");
}

// инициализация вьюпорта
private void InitViewPort()
{
  // установка вьюпорта в соотвествии с размерами элемента
  Gl.glViewport(0, 0, glControl.ClientSize.Width, glControl.ClientSize.Height);

  // настройка проекции
  Gl.glMatrixMode(Gl.GL_PROJECTION);
  Gl.glLoadIdentity();

  // размер окна
  ScreenW = glControl.ClientSize.Width;
  ScreenH = glControl.ClientSize.Height;

  // задаем ортогональную проекцию
  Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH);

  Gl.glMatrixMode(Gl.GL_MODELVIEW);
  Gl.glLoadIdentity();

  // настройка параметров OpenGL для визуализации
  Gl.glEnable(Gl.GL_DEPTH_TEST);
  Gl.glEnable(Gl.GL_COLOR_MATERIAL);

  // очистка буфера цвета и буфера глубины
  Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
}

// рисование
private void Render()
{
  Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
  Gl.glLoadIdentity();
  
  // параметры отображения и выводим данные
  RenderParams renderParams = tmSettingsEditor.CurrentRenderParams;
  DrawTmi(renderParams);

  Gl.glFlush();
}

// отрисовка данных
private void DrawTmi(RenderParams renderParams)
{
  if (renderParams == null)
    return;

  uint[] currentFrame = frames[frames.Count - 1];

  // отрисовка таблицы
  if (renderParams is RenderFrameParams)
  {
    RenderFrameParams renderFrameParams = (RenderFrameParams)renderParams;
    // вывод слов данных
    for (int i = 0; i < renderFrameParams.Words.Count; i++)
    {
      RenderFrameParams.WordLayout word = renderFrameParams.Words[i];
      uint value = (uint)((currentFrame[word.Index] >> word.Shift) & word.Mask);
      Gl.glColor3f(word.Color.R, word.Color.G, word.Color.B);// <------------------------------------ ВОТ ЭТО РАБОТАЕТ НЕПРАВИЛЬНО!!!!!
      GL_RU_TEXT.DrawText(
        (float)word.X,
        (float)ScreenH - (float)word.Y,
        Convert.ToString(value, word.Radix).ToUpper());
    }

    // вывод подписей
    for (int i = 0; i < renderFrameParams.Labels.Count; i++)
    {
      RenderFrameParams.LabelLayout label = renderFrameParams.Labels[i];
      Gl.glColor3f(label.Color.R, label.Color.G, label.Color.B);// <------------------------------------- ВОТ ЭТО РАБОТАЕТ НЕПРАВИЛЬНО!!!!!
      GL_RU_TEXT.DrawText(
        (float)label.X,
        (float)ScreenH - (float)label.Y,
        label.Text);
    }
  }

  // отрисовка простого графика
  // ...
  // отрисовка графика кратных параметров
  // ...
  // отрисовка графика параметров субкоммутатора
  // ...
  // отрисовка гистограммы
  // ...
}


Извиняюсь за объем ))
Может кто-нибудь подсказать, что тут неправильно написано и как с этим бороться?
Ногами прошу не бить, OpenGL я использую первый раз, возможности неторопливого вдумчивого изучения не имею ((

#1
20:23, 17 мар 2010

GL_RU_TEXT.DrawText что внутри?
Что с материалами? Какие настройки? Может у тебя освещение включено?

#2
20:42, 17 мар 2010

Данные, которые юзаешь в при выборе цвета? Чую что b,i версии могли становиться в черный, из-за того, что передаешь им в параметре малые значения, как если бы ты передавал их в f версию.

#3
20:54, 17 мар 2010

word.Color.X в диапазоне 0..1?

#4
21:23, 17 мар 2010

glColor3f ожидает, что значение каждого компонента лежит в диапазоне от 0 до 1, а glColor3b, скорее всего от -127 до 128. Или типа того. По крайней мере glColor3ub - от 0 до 255. У тебя какие значения в word.Color и label.Color? :)

#5
22:37, 17 мар 2010

Executor
> GL_RU_TEXT.DrawText что внутри?
GL_RU_TEXT - класс для отображения кириллического текста, нарыто на просторах интернетов.
Если интересно, выложу код. С удовольствием посмотрел бы на другие варианты вывода русского текста.

> Что с материалами? Какие настройки? Может у тебя освещение включено?
Материалов нет, освещения нет, все настройки в коде, приведенном выше.

Executor
> word.Color.X в диапазоне 0..1?
K.V.
> glColor3f ожидает, что значение каждого компонента лежит в диапазоне от 0 до 1,
> а glColor3b, скорее всего от -127 до 128. Или типа того. По крайней мере
> glColor3ub - от 0 до 255. У тебя какие значения в word.Color и label.Color? :)
MarkoPolo
> Данные, которые юзаешь в при выборе цвета? Чую что b,i версии могли становиться
> в черный, из-за того, что передаешь им в параметре малые значения, как если бы
> ты передавал их в f версию.

По дороге с работы домой начала мелькать подобная мысль насчет float, теперь все прояснилось ))
Спасибо за помощь! Завтра опробую это дело на практике.

#6
23:14, 17 мар 2010

Megakot
> GL_RU_TEXT - класс для отображения кириллического текста, нарыто на просторах интернетов.
> Если интересно, выложу код. С удовольствием посмотрел бы на другие варианты вывода русского текста.

Я просто к тому, что может в этой функции устанавливается цвет...

#7
11:10, 18 мар 2010

Executor
> Я просто к тому, что может в этой функции устанавливается цвет...
Да нет, там тупо вывод символов. Сначала шрифт как-то хитро строится, а потом из него просто дергаются картинки символов и выводятся. Правда, работает это только с двумя-тремя кириллическими шрифтами, остальные выводятся кракозябрами. А вы как русские буковки выводите?

Переправил на glColor3ub - все заработало как надо, спасибо )

#8
13:52, 18 мар 2010

Megakot
> А вы как русские буковки выводите?

Заранее заготовленная текстура с буквами...

#9
14:15, 18 мар 2010

FreeType 2...

ПрограммированиеФорум2D графика и изометрия

Тема в архиве.