使用openGL显示GPUImageOutput的BRGA数据1920 * 1080时不正确

时间:2016-10-27 09:26:27

标签: ios opengl-es gpuimage

enter image description here
对于OpengGL的新手来说,这次事故总是与imageWidth有问题。 GPUImageOutput的数据大小不等于image.width * image.height * bitsPerPixel。在某些代码中,您可能会看到代码,但这是错误的...... 这是一个坑。

使用glPixelStorei(GL_UNPACK_ROW_LENGTH)设置行长度,而不是bytesPerRow。

提示: 如何调试:

#define ASSERT(xx) NSAssert1(xx, @"code:0x%x", glGetError());
ASSERT(glGetError() == GL_NO_ERROR);

问题的历史记录:
昨天晚上:
我找到了。当图像大小为1920 * 1080时,RawDataOutput.bytesPerRow为4352,而不是4320(1080 * 4)。所以图像不正确..
接下来的问题是如何使用glTexImage2d来设置bytesPerRow?

yestorday下午:
我正在使用GPUImageRawDataOutput的数据来创建一个Image 当相机尺寸为1280 * 720或640 * 480时,它就可以了;但是在1920 * 1080时,它出了点问题 我修改了KxMovieView以通过OpenGL视图显示数据,它有同样的错误。然后我修改了kxMovieView以显示我从互联网上获得的一张图片,没关系 我很困惑!我想它可能与image.linesize有些不对,但没有帮助。

GPUImageRawDataOutput的图像格式是BGRA。 kxMovieView默认支持RGB,我只将其更改为RGBA,并在着色器中添加.bgra。

//shader:  
NSString *const zvertexShaderString = SHADER_STRING  
(  
 attribute vec4 position;  
 attribute vec2 texcoord;  
 uniform mat4 modelViewProjectionMatrix;  
 varying vec2 v_texcoord;  

 void main()  
 {  
     gl_Position = modelViewProjectionMatrix * position;  
     v_texcoord = texcoord.xy;  
 }  
);  

NSString *const zrgbFragmentShaderString = SHADER_STRING  
(
 varying highp vec2 v_texcoord;  
 uniform sampler2D s_texture;  

 void main()  
 {  
     gl_FragColor = texture2D(s_texture, v_texcoord).bgra;  
 }  
);  

// KxGLRenderer_RGB      - (NSString *)fragmentShader     {         return zrgbFragmentShaderString;     }

- (void) resolveUniforms: (GLuint) program
{
    _uniformSampler = glGetUniformLocation(program, "s_texture");
}

- (void) setFrame: (KxVideoFrame *) frame
{
    KxVideoFrameRGB *rgbFrame = (KxVideoFrameRGB *)frame;

    assert(rgbFrame.rgb.length == rgbFrame.width * rgbFrame.height * 4);

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    if (0 == _texture)
        glGenTextures(1, &_texture);

    glBindTexture(GL_TEXTURE_2D, _texture);

    glTexImage2D(GL_TEXTURE_2D,
                 0,
                 GL_RGBA,
                 (GLsizei)frame.width,
                 (GLsizei)frame.height,
                 0,
                 GL_RGBA,
                 GL_UNSIGNED_BYTE,
                 rgbFrame.rgb.bytes);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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);
}

- (BOOL) prepareRender
{
    if (_texture == 0)
        return NO;

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, _texture);
    glUniform1i(_uniformSampler, 0);

    return YES;
}

1 个答案:

答案 0 :(得分:1)

GPU硬件可能需要与图像宽度不完全匹配的步幅。报告与图像宽度不匹配的宽度时,GPUImageRawDataOutput会正确处理。

您可以告诉GL您的图片数据与glPixelStorei的宽度不同(GL_UNPACK_ROW_LENGTH)