Кропаю потихоньку на 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 я использую первый раз, возможности неторопливого вдумчивого изучения не имею ((
GL_RU_TEXT.DrawText что внутри?
Что с материалами? Какие настройки? Может у тебя освещение включено?
Данные, которые юзаешь в при выборе цвета? Чую что b,i версии могли становиться в черный, из-за того, что передаешь им в параметре малые значения, как если бы ты передавал их в f версию.
word.Color.X в диапазоне 0..1?
glColor3f ожидает, что значение каждого компонента лежит в диапазоне от 0 до 1, а glColor3b, скорее всего от -127 до 128. Или типа того. По крайней мере glColor3ub - от 0 до 255. У тебя какие значения в word.Color и label.Color? :)
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, теперь все прояснилось ))
Спасибо за помощь! Завтра опробую это дело на практике.
Megakot
> GL_RU_TEXT - класс для отображения кириллического текста, нарыто на просторах интернетов.
> Если интересно, выложу код. С удовольствием посмотрел бы на другие варианты вывода русского текста.
Я просто к тому, что может в этой функции устанавливается цвет...
Executor
> Я просто к тому, что может в этой функции устанавливается цвет...
Да нет, там тупо вывод символов. Сначала шрифт как-то хитро строится, а потом из него просто дергаются картинки символов и выводятся. Правда, работает это только с двумя-тремя кириллическими шрифтами, остальные выводятся кракозябрами. А вы как русские буковки выводите?
Переправил на glColor3ub - все заработало как надо, спасибо )
Megakot
> А вы как русские буковки выводите?
Заранее заготовленная текстура с буквами...
FreeType 2...
Тема в архиве.