Ruby、openGL:更改纹理亮度

Ruby, openGL : change texture luminosity

我在 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 -@window.camera.horizontal_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 的数字来使 sprite 更暗,但我不能反其道而行之。我怎样才能做到这一点 ?例如,我怎样才能使 sprite 完全变白?

要完全控制您的片段处理,最好的方法是使用可编程管道,您可以在其中使用 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。

固定管道中有更复杂的功能,可让您更好地控制如何使用纹理值生成颜色。您可以通过查找 "texture combiners" 找到它。但在我个人看来,如果您需要足够复杂的东西以需要纹理组合器,那么您最好转向可编程管道。