OpenGL 着色器无法在设备上编译
OpenGL shader fails to compile on device
我正在编写一个计算着色器,它应该在 PC 上 运行 和 Android。它在 PC 上运行良好,但无法在 Android 上编译。
这是着色器:
#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);
returns
GL version:OpenGL ES 3.1 V@141.0 (GIT@I0bc8e21cf2)
这是在 Sony Xperia Z5 上运行的(Android 模拟器似乎不支持 OpenGL ES 3.1)。
如果输出图像被声明为只写,着色器编译:
layout (rgba8, binding = 0) uniform writeonly image2D img_output;
不知道为什么需要这个,有人 link 讨论这个的规范吗?
这在第 72 页的“4.9 内存访问限定符”部分的 GLSL ES 3.10 spec 中指定:
Except for image variables qualified with the format qualifiers r32f, r32i, and r32ui, image variables must specify either memory qualifier readonly or the memory qualifier writeonly.
此限制在 GLSL ES 3.20 中仍然适用。
我正在编写一个计算着色器,它应该在 PC 上 运行 和 Android。它在 PC 上运行良好,但无法在 Android 上编译。
这是着色器:
#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);
returns
GL version:OpenGL ES 3.1 V@141.0 (GIT@I0bc8e21cf2)
这是在 Sony Xperia Z5 上运行的(Android 模拟器似乎不支持 OpenGL ES 3.1)。
如果输出图像被声明为只写,着色器编译:
layout (rgba8, binding = 0) uniform writeonly image2D img_output;
不知道为什么需要这个,有人 link 讨论这个的规范吗?
这在第 72 页的“4.9 内存访问限定符”部分的 GLSL ES 3.10 spec 中指定:
Except for image variables qualified with the format qualifiers r32f, r32i, and r32ui, image variables must specify either memory qualifier readonly or the memory qualifier writeonly.
此限制在 GLSL ES 3.20 中仍然适用。