这是我的第一篇文章,我最近才开始为Android和OpenGl编程,所以请对我好一点:)
我正在写一个小应用程序,将包括一个屏幕,将使用调色板图像的颜色快速变化。为了提高速度,我想我可以使用着色器实现系统,所以我使用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规范中也找不到任何东西表明这是不可能的,那么我哪里错了呢?
如果这根本不可能,那么有没有人有其他想法来绕过我的计划中这个相当严重的缺陷呢?
发布于 2011-01-11 01:27:13
不,常量数组不能被变量索引,但你可以很容易地使用纹理而不是常量数据数组来进行调色板查找。使用GLSL2D纹理,并在Nx1中使用texture2D进行查找。
当然,您需要使用OpenGL中的普通纹理函数从CPU端加载纹理数据。
https://stackoverflow.com/questions/4649345
复制相似问题