OpenGL着色器无法在设备上编译

时间:2016-08-17 11:01:25

标签: android opengl-es compute-shader

我正在编写一个计算着色器,它应该在PC和Android上运行。它在PC上工作正常,但它不能在Android上编译。

这是着色器:

    Template.editAdmin.onCreated(function() {
     this.userData = new ReactiveVar([]);
   });

   Template.editAdmin.onRendered(function() {
     Meteor.call("getUsersData", this.data, function(err, result) {
        Template.instance().editAdminId.set(result);
      });
   });

错误是:
#version 310 es uniform vec2 lightPos; // passed from the app layout (local_size_x = 512, local_size_y = 1) in; layout (rgba8, binding = 0) uniform image2D img_output; layout (rgba8, binding = 1) uniform readonly image2D colorTex; layout (rgba8, binding = 2) uniform readonly image2D transpTex; void main () { imageStore(img_output, ivec2(3, 6), vec4(0.3 ,0.2 ,0.5 ,0.9)); }

如果我将最后一个参数更改为Shader compile error: ERROR: '' : unsupported format on read/write imageivec4,我会得到:
uvec4

ERROR: 'imageStore' : no matching overloaded function found返回 GL.GetString(StringName.Version);

这是在Sony Xperia Z5上(Android模拟器似乎不支持OpenGL ES 3.1)。

2 个答案:

答案 0 :(得分:1)

这在GLSL ES 3.10 spec,第72页“4.9内存访问限定符”部分中指定:

  

除了使用格式限定符r32f,r32i和r32ui限定的图像变量外,图像变量必须指定内存限定符readonly或内存限定符writeonly。

此限制仍适用于GLSL ES 3.20。

答案 1 :(得分:0)

如果输出图像声明为只写,则着色器编译:

layout (rgba8, binding = 0) uniform writeonly image2D img_output;

不知道为什么需要这样做,是否有人链接到讨论此规范的规范?