【发布时间】:2014-04-04 15:47:55
【问题描述】:
我有一个工作链,iMX53 上的 GPU (AMD Z430) 采用 YUV420P 格式的解码视频帧,转换为 RGB565 并显示它。我唯一关心的是速度,更确切地说是缺乏速度。输入视频帧为1920x1088 YUV420P,转换时间为40ms,我根本无法让它跑得更快。我试图优化我的着色器,但没有运气。我也尝试过 2D 色域,它甚至更慢(并且由于其 2D 特性,它提供了一些不正确的颜色)。当然,我不是 OpenGL ES 专家。
这是我的着色器:
static const char *fragment_shader_yuv_src =
"const lowp mat3 rgb_coeff = mat3(1, 1, 1, 0, -0.344, 1.772, 1.402, -0.714, 0);\n"
"varying lowp vec2 v_texcoord;\n"
"uniform lowp sampler2D s_texture_y;\n"
"uniform lowp sampler2D s_texture_u;\n"
"uniform lowp sampler2D s_texture_v;\n"
"\n"
"void main()\n"
"{\n"
" lowp vec3 yuv = vec3(texture2D(s_texture_y, v_texcoord).r, texture2D(s_texture_u, v_texcoord).r - 0.5, texture2D(s_texture_v, v_texcoord).r - 0.5);\n"
" gl_FragColor = vec4(rgb_coeff * yuv, 1.0);\n"
"}\n";
static const char *vertex_shader_yuv_src =
"attribute lowp vec4 position; \n"
"attribute lowp vec2 texcoord; \n"
"varying lowp vec2 v_texcoord; \n"
" \n"
"void main() \n"
"{ \n"
" gl_Position = position; \n"
" v_texcoord = texcoord.xy; \n"
"} \n";
s_texture_y/u/v 包含适当的颜色分量,图像由 eglCreateImageKHR(...) 分配,并由 glEGLImageTargetTexture2DOES(...) 分配给纹理。
正如我上面提到的,它可以工作,但速度很慢。我无法确定这是 GPU 的最大性能还是我在着色器中做错了什么......
(使用最简单的着色器放大和绘制简单的 416x416 RGBA32 图像也很慢,~23ms)
任何人有任何想法,经验?我应该如何优化我的着色器?
【问题讨论】: