2015-05-31 4 views
1

У меня есть некоторые проблемы с OpenGL и яркостью. Позвольте мне объяснить вам мою проблему:Ruby, openGL: изменение текстурной яркости

sprite

Я нарисовал эту «спрайт» (это только самолет здесь) с кодом вроде этого:

sprite.set_active 
left, right, top, bottom = 0.0, 1.0, 1.0, 0.0 
glPushMatrix 
    glTranslate(@position.x - 16, @position.y, @position.z) 
    glRotate(-90 [email protected]_angle, 0, 1, 0) 
    glScale(chara.width, chara.height, 32.0) 
    begin 
     glEnable(GL_BLEND) 
     glBegin(GL_QUADS) 
      glColor4f(1.0, 1.0, 1.0, 1.0) 
      glTexCoord2d(left, top); glVertex3f(0, 1, 0.5) 
      glTexCoord2d(right, top); glVertex3f(1, 1, 0.5) 
      glTexCoord2d(right, bottom); glVertex3f(1, 0, 0.5) 
      glTexCoord2d(left, bottom); glVertex3f(0, 0, 0.5) 
     glEnd 
     glDisable(GL_BLEND) 
    rescue 

    end 
glPopMatrix 

Моя проблема с этой линии:

glColor4f(1.0, 1.0, 1.0, 1.0) 

Ну, я могу поставить число меньше 1,0, чтобы иметь более темный спрайт, но я не могу сделать наоборот. Как я могу это сделать ? Как я могу заставить спрайт быть полностью белым, например?

ответ

1

Чтобы получить полный контроль над обработкой фрагментов, наилучшим подходом является использование программируемого конвейера, где вы можете реализовать именно то, что хотите с кодом GLSL.

Но есть некоторые варианты, которые могут работать для этого случая в фиксированном конвейере. Самый простой - это использование другого GL_TEXTURE_ENV_MODE. Значение по умолчанию: GL_MODULATE, что означает, что цвет, который вы указали с помощью glColor4f(), умножается на цвет от текстуры. Как вы обнаружили, это позволяет сделать текстуру темнее, но не ярче.

Вместо этого вы можете использовать GL_ADD. Как следует из названия, это даст конечный результат в виде суммы цвета текстуры и цвета от glColor4f(). Например:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD); 
glColor4f(0.2f, 0.2f, 0.2f, 0.0f); 

добавит 0,2 к компонентам цвета, считанным с текстуры.

В фиксированном конвейере более сложная функциональность, которая дает вам больше контроля над тем, как значения текстуры используются для генерации цветов. Вы можете найти его, ища «комбинаторы текстур». Но, по моему личному мнению, вам гораздо лучше перейти к программируемому конвейеру, если вам нужно что-то достаточно сложное, чтобы требовать объединения текстур.

+0

Спасибо, что это, наконец, работает! Вы знаете, как управлять насыщением с помощью такого решения? – Wano