繁体   English   中英

片段着色器中的数组索引

[英]Array indexing in fragment shader

这是我的第一篇文章,而且我最近才开始为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规范中找不到任何暗示也不可能的东西,那么我在哪里出错呢?

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

不,常量数组不能由变量索引,但是您可以使用纹理而不是常量数据数组轻松进行调色板查找。 使用Nx1 2D纹理并使用GLSL中的texture2D进行查找。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM