我正在编写一个计算着色器,它应该在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 image
或ivec4
,我会得到:
uvec4
ERROR: 'imageStore' : no matching overloaded function found
返回
GL.GetString(StringName.Version);
这是在Sony Xperia Z5上(Android模拟器似乎不支持OpenGL ES 3.1)。
答案 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;
不知道为什么需要这样做,是否有人链接到讨论此规范的规范?