【问题标题】:error in the output texture yuv422 in iosios中输出纹理yuv422中的错误
【发布时间】:2013-03-23 12:33:48
【问题描述】:

这是 ipad 的屏幕截图 http://joxi.ru/7J9NUdg5CbCJWOM8-i0 存在http://joxi.ru/SspPUdg5CbBrLdFutis

错误:

1)图片(http://joxi.ru/CYRRUdg5CbDiKIByZLo

2) 大小,不是全屏

我的着色器:

NSString *const yuvFragmentShaderString = SHADER_STRING
(
 varying highp vec2 texCoordVarying;
 uniform sampler2D s_texture_y;
 uniform sampler2D s_texture_u;
 uniform sampler2D s_texture_v;

void main()
{
 highp float y = texture2D(s_texture_y, texCoordVarying).r;
 highp float u = texture2D(s_texture_u, texCoordVarying).r - 0.5;
 highp float v = texture2D(s_texture_v, texCoordVarying).r - 0.5;

 highp float r = y +             1.402 * v;
 highp float g = y - 0.344 * u - 0.714 * v;
 highp float b = y + 1.772 * u;

 gl_FragColor = vec4(r,g,b,1.0);
}
);

我无法理解着色器或其他地方的问题是什么? 我可以添加代码

更新

创建纹理

const NSUInteger widths[3]  = { width, width / 2, width / 2 };
const NSUInteger heights[3] = { height, height, height};
for (int i = 0; i < 3; ++i) {

    glBindTexture(GL_TEXTURE_2D, texture[i]);

    glTexImage2D(GL_TEXTURE_2D,
                 0,
                 GL_LUMINANCE,
                 widths[i],
                 heights[i],
                 0,
                 GL_LUMINANCE,
                 GL_UNSIGNED_BYTE,
                 //pixels[i]);
                 bytes->data[i]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}

活性纹理

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glUniform1i(uniforms[UNIFORM_TEXTURE], 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glUniform1i(uniforms[UNIFORM_TEXTURE1], 1);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, texture[2]);
glUniform1i(uniforms[UNIFORM_TEXTURE2], 2);

绘制纹理

GLfloat mvpMatrix[16];
[self prepareRender];
[EDMatrixTools applyIdentity:mvpMatrix];
glUniformMatrix4fv(uniforms[UNIFORM_MVP_MATRIX], 1, GL_FALSE, mvpMatrix);

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTURE_COORD, 2, GL_FLOAT, 0, 0, squareTexCoords);
glEnableVertexAttribArray(ATTRIB_TEXTURE_COORD);

[self drawArraysFirst:0 Count:4];
[self presentFramebuffer];

【问题讨论】:

  • 如果您描述您正在尝试做什么以及您已经尝试过什么,这可能会有所帮助。您的代码正在做各种古怪的事情。我会先简单地完全按原样渲染纹理而不进行转换,然后您可以向前一步添加 y/u/v 位。
  • 我绘制了来自流的纹理。来到 yuv,当我使用 swscale 转换为 rgb 时,一切正常。我要优化,在shader中做转换
  • 看起来问题在于您如何上传纹理,而不是颜色转换。看起来您的数据宽度有误。
  • 在这种情况下,尝试发出 r/g/b 作为“y”变量来验证纹理。这样你就可以看到图像是否正确通过,通常是纹理没有正确通过。
  • 例如github.com/kolyvan/kxmovie。尺寸:const NSUInteger 宽度 [3] = {宽度,宽度/2,宽度/2}; const NSUInteger heights [3] = {height, height / 2, height / 2};

标签: ios opengl-es-2.0 yuv


【解决方案1】:

2) 大小,不是全屏

CGRect screenRect = [[UIScreen mainScreen] bounds];
CAEAGLLayer eaglLayer = (CAEAGLLayer) self.layer;
[eaglLayer setBounds:screenRect];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2018-05-28
    • 2023-03-26
    • 2016-12-30
    相关资源
    最近更新 更多