我在使用OpenGL和发光时遇到了一些问题。让我解释一下我的问题:
我画了这个"精灵" (它只是这里的一架飞机),代码如下:
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的数字来制作一个更暗的精灵,但我不能这样做。我怎样才能做到这一点 ?例如,如何让精灵完全变成白色?
答案 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添加到从纹理中读取的颜色分量。
固定管道中有更复杂的功能,可让您更好地控制纹理值如何用于生成颜色。你可以通过寻找“纹理组合器”找到它。但是在我个人看来,如果你需要复杂到足以需要纹理合并器的东西,你最好转向可编程管道。