Непонятки с цветом в OpenGL

Тема в разделе "WASM.OpenGL", создана пользователем DillerInc, 4 май 2008.

  1. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Доброго всем времени суток.
    Возникла следующуя проблема.Накладываю текстуру,как описывал Tyler Durden в своей статье.Там используется некий трюк с цветом,а именно усиление трёх компонентов и одновременное исключение зелёного компонента:
    Код (Text):
    1. ;изменим цвет объекта (нулевое значение уберет зеленые компоненты текстуры, большее значение увеличит яркость красных и синих, а также альфа-компоненту)
    2. invoke glColor4f,10.0,0.0,10.0,10.0
    Всё работает как положено.
    Но проблема в том,что если я потом прорисовываю какую-то другую фигуру и хочу указать ей иной цвет,например:
    Код (Text):
    1. invoke glColor4ub, 153, 255, 255, 255
    ...то цвет новой фигуры вообще никак не меняется -- он всё время получается какого-то тёмно-малинового цвета -- словно бы мы и не вызываем никакой функции по установке цвета.
    Почему так получается?И как исправить положение?
     
  2. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ты знаешь, я тоже маялся с этим байтным вариантом, но безуспешно.
    только у меня это было из-за математики целых величин, цифра просто терялась, в каком ты её порядке ни поставь..
    исправить было можно, но по коду выходит себе дороже..
    так что лучше юзай флоат, и не парьсо -)
     
  3. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Comer_
    Использовал я и float тоже,например:
    Код (Text):
    1. invoke glColor4f, 0.0, 1.0, 0.0, 1.0
    Но вместо того,чтобы моя новая фигура приняла зелёный цвет,она всё равно остаётся этого тёмно-малинового цвета.
    Можно ли как-то сбросить текущий цвет,т.е. тот,который был устаноавлен выше функцией:
    Код (Text):
    1. invoke glColor4f,10.0,0.0,10.0,10.0
    ??
    Просто может тут получается какой-то нестандартный вариант с использованием вещественного числа 10.0...

    EDIT.

    Сейчас попробовал сохранить все аттрибуты с помощью функции:
    Код (Text):
    1. invoke glPushAttrib, GL_ALL_ATTRIB_BITS
    Вроде бы малиновый цвет исчез,но теперь я всё равно не могу придать текстуре цвет,какой хочу.Она отображается чёрно-белой(она такая и есть)...
    И вот вопрос: как вызвать функцию glPushAttrib,чтобы не сохранять все биты,а сохранить только те,которые опеределяют цвет?
     
  4. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    invoke glColor4f,10.0,0.0,10.0,10.0
    бгг, надо писать 1.0, ибо в флоат версии оно именно так: от 1.0 до 0.0(как 255 до 0)
    и посмотри размещение: цвет должен задаваться перед прорисовкой полигона.
     
  5. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...знаю,но у Тулера было именно так,и это даёт реальный результат: усиливает яркость соответствующего компонента.
    ...так и есть.

    EDIT.

    Атас!
    Я почему-то думал,что для правильного смешивания для второй фигуры необходимо отключать GL_COLOR_MATERIAL...Оказывается,что не нужно было.Теперь цвет нормально изменяется.

    Но вопрос остаётся открытым: какие параметры передать функции glPushAttrib,чтобы она сохранила состояние текущего цвета??А то иначе приходится сохранять всё,чтобы не промахнутся...

    EDIT.

    В общем,решение следующее:
    Код (Text):
    1. ; /* Сохраняем текущее состояние цвета */
    2. invoke glPushAttrib, GL_CURRENT_BIT
    3. ...
    4. ; /* Усиливаем красный,синий и альфа-компоненты,а также исключаем зелёный компонент */
    5. invoke glColor4f, 10.0, 0.0, 10.0, 10.0
    6. ...
    7. ; /* Восстанавливаем состояние цвета */
    8. invoke glPopAttrib
    9. ...
    10. ; /* Задаём другой цвет (например, зелёный) */
    11. invoke glColor4f, 0.0, 1.0, 0.0, 1.0
     
  6. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    А почему бы не перенести отрисовку геометрии с цветом <glColor4f, 0.0, 1.0, 0.0, 1.0> в самое начало, до задания странного цвета из десяток? Тогда Push-/PopAttrib окажется вообще ненужным...
     
  7. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    до кучи, еще одна проблемка по сабжу:

    Код (Text):
    1. начало цикла
    2.     glClear GL_COLOR_BUFFER_BIT || GL_DEPTH_BUFFER_BIT
    3.      тут чтото рисуется - квадратик какой-нибудь
    4.      (с текстурой или без, не важно)
    5.      glColor3f 1.0f, 1.0f, 0.0f
    6.      тут текст заданным выще цветом
    7.      и SwapBuffer
    8. конец цикла
    прикол в том что квадратик тоже желтым рисуется...
    что за дела такие=( а как же glClear GL_COLOR_BUFFER_BIT ???
     
  8. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    так цикл же. Надо перед квадратиком задавать цвет квадратика, потом перед текстом цвет текста. Иначе
    Итерация 0:
    (экран очищен, цвет неопределен)
    - белый квадрат
    - желтый текст
    Итерация 1:
    (экран очищен)
    - желтый квадрат
    - желтый текст
    ...
    и т.д.

    glClear не меняет текущий цвет, а всего лишь устанавливает (в данном случае) буфер цвета в значения, ранее заданные функцией glClearColor (т.е. очищает буфер цвета). Цвет, которым рисуются примитивы, остается = последнему установленному функцией glColor
     
  9. _vi_

    _vi_ Денис

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    48
    ужоз какой=)