OpenGL - 在没有着色器的情况下更改纹理的色调

时间:2014-03-13 17:09:33

标签: opengl

我正在使用传统的OpenGL(2.0或更少)命令绘制2D Sprites,我希望能够在不使用Fragment-Shaders的情况下更改渲染行为,特别是我希望能够将精灵的色调更改为任意颜色,尊重精灵的Alpha值仅使可见部分的颜色不同。有没有一种简单的方法可以做到这一点?

编辑:举个例子:在RPG-Maker系列中,您可以在地图场景中对任何实体进行着色或在战斗场景中对战斗精灵进行着色,就像当某些东西被击中时,攻击动画的精灵被吸引而与此同时,击中目标的精灵闪烁红色 - 所有东西的持续时间,颜色和强度都可以调整 - 现在我只是在寻找关于如何改变任何精灵的色调的裸露,其余只是建模和建立。

代码:这就是我所做的绘制精灵透明的方法,它似乎与宣传的一样。

[...] init(){ glEnable(GL2.GL_TEXTURE_2D); glEnable(GL2.GL_BLEND); glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA); glEnable(GL2.GL_COLOR_MATERIAL); }[...]

drawSpriteTransparent(Sprite sprite, int x, int y, float transparency) { Texture t = sprite.getTexture(); double tx = sprite.getTexutreX(); double ty = sprite.getTextureY(); double tw = sprite.getWidthInTexture(); double th = sprite.getHeightInTexture(); glBindTexture(GL2.GL_TEXTURE_2D, t.getTextureID()); glColor4f(1, 1, 1, 1f - transparency); glBegin(GL2.GL_QUADS); { glTexCoord2d(tx, ty); glVertex3d(x, y, 0); glTexCoord2d(tx, ty + th); glVertex3d(x, y + sprite.getHeight(), 0); glTexCoord2d(tx + tw, ty + th); glVertex3d(x + sprite.getWidth(), y + sprite.getHeight(), 0); glTexCoord2d(tx + tw, ty); glVertex3d(x + sprite.getWidth(), y, 0); } glEnd(); glBindTexture(GL2.GL_TEXTURE_2D, 0); }

编辑:使用glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )不能产生预期的结果,尽管使用glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD )至少可以让我增加所需颜色的颜色强度,但它不允许我增加一个值每个可见像素完全具有所需颜色的点(我想要的是: (1,0,0,0.1) - >更多红色 (1,0,0,0.5) - >更多红色{{1} } - >每个渲染像素都是100%红色,但原始alpha值为0的像素仍未渲染)

1 个答案:

答案 0 :(得分:0)

我想你可以使用固定管道多纹理(将色调作为单独的纹理加载)来做这样的事情,因为它有两个令人眼花缭乱的选项,如何将两个纹理混合在一起。