2016-08-17 28 views
0

我在写一个计算着色器,它应该在PC和Android上运行。它在PC上运行良好,但不能在Android上编译。OpenGL着色器无法在设备上编译

这是着色器:

#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

如果我改变的最后一个参数ivec4uvec4我得到:
ERROR: 'imageStore' : no matching overloaded function found

GL.GetString(StringName.Version);回报 GL version:OpenGL ES 3.1 [email protected] ([email protected])

这是在索尼Xperia Z5上(Android仿真器似乎不支持OpenGL ES 3.1)。

+0

https://www.opengl.org/sdk/docs/man/html/imageStore.xhtml查看opengl版本是否支持'imageStore'功能。 – ASK

+0

@ASK支持ES 3.1:https://www.khronos.org/opengles/sdk/docs/man31/html/imageStore.xhtml(我的着色器是ES 3.1) – sydd

回答

1

这在GLSL ES 3.10 spec被指定时,72页中的章节“4.9内存访问限定符”:

除了与格式限定符R32F,r32i和r32ui合格图像变量,图象变量必须指定内存限定符只读或内存限定符writeonly。

此限制在GLSL ES 3.20中仍然适用。

0

着色器编译仅在输出图像声明写:

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

不知道为什么这是必要的,没有任何人有一个链接,其中讨论这个规范?