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