Ruby,openGL:改变纹理亮度

时间:2015-05-31 11:22:26

标签: ruby opengl textures

我在使用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的数字来制作一个更暗的精灵,但我不能这样做。我怎样才能做到这一点 ?例如,如何让精灵完全变成白色?

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添加到从纹理中读取的颜色分量。

固定管道中有更复杂的功能,可让您更好地控制纹理值如何用于生成颜色。你可以通过寻找“纹理组合器”找到它。但是在我个人看来,如果你需要复杂到足以需要纹理合并器的东西,你最好转向可编程管道。