1

我使用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));
}

所以看起来它以相同的方式访问纹理,但是 vec(0,0,0,1) 被返回texture()。所以屏幕是黑的。

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

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

为什么这个扩展在我的计算着色器中不能正常工作?它应该在计算着色器中工作吗?

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

4

0 回答 0