2011-01-10 91 views
0

这是我的第一篇文章,我是最近才开始编程为Android和OpenGL,所以对我很好:)数组索引

我正在写一个小应用程序,其中将包括一个屏幕这将使用一个palettised图像来快速改变颜色。对于速度,我认为我可以使用着色器来实现系统,所以我使用Open GL ES 2.0编程指南中的精彩示例启动并运行着色器。过去几天我一直在抨击我的问题是在着色器中引用我的调色板数据。

我着色器目前是:

precision lowp float; 
varying vec2  v_texCoord; 
uniform sampler2D s_texture; 
uniform int  s_palette[204]; // Specify a palette of 64 rgb entries 

void main() 
{ 
    vec4 col = texture2D(s_texture, v_texCoord); 
    int index = (int(col.r * 255.0) * 3; 

    gl_FragColor = vec4(float(s_palette[index])/255.0, float(s_palette[index+1])/255.0, float(s_palette[index+2])/255.0, 1.0); 
} 

玩这个行之有年,并没有得到后,很远我发现,如果我用一个恒定值引用我的调色板数据,我可以通过引用得到结果,但不与一个变量。在Google上搜索了一段时间之后,我发现这只是GLSL 1.1的方式,并且已经用GLSL 1.3修复了。我相信Android正在基于GLSL 1.3的GLSL ES1.0上运行,所以它应该可以工作,但是我不能让我的生活得到它的工作。我在GLSLES规范中找不到任何暗示它不可能的东西,所以我错在哪里?

如果根本不可能,那么有没有人有任何其他想法如何解决这个在我的计划中相当严重的缺陷?

回答

0

不,常量数组无法通过变量进行索引,但可以使用纹理而不是常量数据数组轻松地进行调色板查找。使用Nx1 2D纹理,并在GLSL中使用texture2D进行查找。

当然,您需要使用OpenGL中的常规纹理函数从CPU端加载纹理数据。

+0

非常感谢。像魅力一样工作。 :) – Teknogrebo 2011-01-12 14:48:07