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