计算着色器中的GL_OES_EGL_image_external_essl3扩展名无法正常工作

时间:2017-07-11 16:41:06

标签: android opengl-es mali

我使用GL_OES_EGL_image_external_essl3扩展程序访问GLSL中的相机图片。对于片段着色器,它可以正常工作。这是我的简单片段着色器:

#version 320 es
#extension GL_OES_EGL_image_external_essl3 : require

precision mediump float;

uniform samplerExternalOES cameraTexture;

in vec2 v_TexCoordinate;
out vec4 fragmentColor;

void main() {
    fragmentColor = texture(cameraTexture, v_TexCoordinate);
}

我可以看到相机的照片。

然而,当我在管道中插入一个简单的计算着色器阶段,只将该外部图像中的数据复制到我显示的新纹理时,我只能看到黑屏。我还在计算着色器中生成一条红线用于调试。

以下是该计算着色器的代码:

#version 320 es
#extension GL_OES_EGL_image_external_essl3 : require

precision mediump float;

layout(local_size_x = LOCAL_SIZE, local_size_y = LOCAL_SIZE) in;
layout(binding=1, rgba8) uniform mediump writeonly image2D outputImage;

uniform samplerExternalOES cameraTexture;

void main() {
    ivec2 position = ivec2(gl_GlobalInvocationID.xy);

    vec4 cameraColor = texture(cameraTexture, vec2(gl_GlobalInvocationID.xy)/1024.);
    imageStore(outputImage, position, cameraColor);

    // generate a red line to see that in general the texture
    // that is produced by the compute shader is displayed on the
    // screen
    if (position.x == 100) imageStore(outputImage, position, vec4(1,0,0,1));
}

所以它似乎以相同的方式访问纹理,但是texture()返回了vec(0,0,0,1)。因此屏幕是黑色的。

在这两种情况下,我都会像这样绑定纹理:

glActiveTexture(GL_TEXTURE0)
glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mCameraTextureId)
glUniform1i(cameraUniformHandle, 0)

为什么此扩展程序在我的计算着色器中无法正常工作?是否应该在计算着色器中工作?

我的平台是三星Galaxy S7(Mali GPU)。

0 个答案:

没有答案