【发布时间】:2015-05-19 20:18:17
【问题描述】:
我正在尝试通过 openGL 在 Android 上绘制相机预览。预览纹理是通过 SurfaceTexture 作为外部 EGL 图像获得的,然后我使用一个相当简单的着色器来绘制它:
#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES sTexture;
varying vec2 texCoord;
void main() {
gl_FragColor = texture2D(sTexture,texCoord);
}
在 nexus 5 上,它适用于高达 1280x960 的所有预览图像。但是对于最大的 2:1920x1080 和 1600x1200,屏幕只是空白。我在通过 camera.getSupportedPreviewSizes 获得的相机中设置了预览大小,因此我不会尝试设置相机不支持的任何内容。
public List<Camera.Size> getSupportedResolutions()
{
List<Camera.Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes();
List<Camera.Size> pictureSizes = mCamera.getParameters().getSupportedPictureSizes();
pictureSizes.retainAll(previewSizes);
return pictureSizes;
}
private void setResolution(int position)
{
List<Camera.Size> res = getSupportedResolutions();
Camera.Parameters p = mCamera.getParameters();
p.setPictureSize(res.get(position).width, res.get(position).height);
p.setPreviewSize(res.get(position).width, res.get(position).height);
mCamera.setParameters(p);
}
任何建议这些决议可能会出现什么问题?也许opengl中的某种大小限制?
【问题讨论】:
-
有一个最大纹理大小,您可以查询:stackoverflow.com/questions/8573178。但是,这可能比您的相机图像大得多。我不知道“外部”纹理是否有单独的限制。如果您只是将它们直接发送到 TextureView(内部使用 SurfaceTexture)或 SurfaceView(不使用),这些较大的分辨率是否有效?
-
我发现了问题所在。如果预览尺寸大于我的表面视图的尺寸,我只是设置了不正确的视口。通过 (0, screenW) , (0, screenH) 固定它可以解决问题。外部图像没有单独的限制,这完全是我的错
-
你应该把它写下来作为答案——stackoverflow.com/help/self-answer
标签: android opengl-es android-camera external glsurfaceview