如何更改纹理上某些彩色像素的颜色?

时间:2014-08-17 16:30:09

标签: java colors textures lwjgl

我有黑白纹理(800 * 600像素),我想将黑色像素更改为黑色但非常透明,并将白色像素更改为完全透明。

我尝试过使用显而易见的方法:将FloatBuffer与纹理数据一起运行并运行for循环。像这样的黑色像素:

FloatBuffer data; //The texture data (rgba)
float[] change = new float[]{0, 0, 0, 1}; //Current black color
float[] insert = new float[]{0, 0, 0, 0.5f}; //The new transparent black color

for(int i = 0; i < data.length; i+=4){
    if(data.get(i) == change[0] && data.get(i+1) == change[1] && data.get(i+2) == change[2] && data.get(i+3) == change[3]){
        data.put(i, insert[0]);
        data.put(i+1, insert[1]);
        data.put(i+2, insert[2]);
        data.put(i+3, insert[3]);
    }
}

结果非常慢,我在互联网上环顾四周,找到了这个着色器。所以我的问题是:

我应该使用某种着色器代码,在opengl / lwjgl中是否有一些内置方法,或者这是我需要在cpu上做的事情,在这种情况下,最好的方法是什么?

对于可怕的标题和一些拼写问题感到抱歉,但我希望你理解。

1 个答案:

答案 0 :(得分:0)

有几种方法可以优化现有代码以提高速度:

你可以通过不在if语句中调用data.get()四次来提高速度,而是通过一次获取所有像素并检查黑色。这是我在你的代码中看到的最大瓶颈。

另一种加快速度的方法就是忽略Alpha颜色数据,如果你可以假设黑色像素的所有alpha数据都设置为1或接近它的东西。

优化的第三种方法是将RGB数据检查为整数而不是浮点数。

最后,我不确定FloatBuffer和data.get()/ put()是如何工作的,但是如果你每次都打开和关闭文件,这将是非常的慢。读入内存一次,进行更改,然后只将文件写出一次。

希望这会有所帮助。祝你好运!