2016-10-27 3 views
-1

enter image description here
newcomer to OpengGL의 경우이 사고는 항상 imageWidth에 문제가 있습니다. GPUImageOutput의 데이터 크기가 image.width * image.height * bitsPerPixel과 같지 않습니다. 일부 코드에서는 코드를 볼 수 있지만 잘못되었습니다 ... 그것은 구덩이입니다.OpenGL을 사용하여 GPUImageOutput의 BRGA 데이터를 표시 할 때 잘못된 경우 1920 * 1080

glPixelStorei (GL_UNPACK_ROW_LENGTH)를 사용하여 bytesPerRow가 아닌 ​​행 길이를 설정하십시오.

팁 : 디버깅하는 방법 :

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

질문의 역사 :
어제 밤 :
내가 그것을 발견했다. 이미지 크기가 1920 * 1080 일 때 RawDataOutput.bytesPerRow는 4320 (1080 * 4)이 아닌 4352입니다. 그래서 이미지가 올바르지 않습니다.
다음 질문은 glTexImage2d를 사용하여 bytesPerRow를 설정하는 방법입니까?

yestorday 오후 :
GPUImageRawDataOutput의 데이터를 사용하여 하나의 이미지를 만듭니다.
카메라의 크기가 1280 * 720 또는 640 * 480 인 경우 Ok입니다. 그러나 1920 * 1080으로, 그것은 틀린 무엇인가 가지고있다.
OpenGL보기로 데이터를 표시하도록 KxMovieView가 수정되었지만 잘못되었습니다. 그런 다음 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 { 반환 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

올리기 [, 최소를 완료하고 검증 가능한 예 (http://stackoverflow.com/help/mcve). – ybungalobill

+0

코드가 너무 많습니다. GPUImageRawDataOutput의 데이터를 표시하기 위해 kxMovieView의 코드 만 편집합니다. GPUImageView의 출력 결과가 맞습니다. 그래서 GPUImageRawDataOutput의 데이터가 무엇인지 잘못 알고 싶습니다. – Huangzy

답변

1

GPU 하드웨어는 정확하게 이미지 너비와 일치하지 않는 보폭이 필요할 수 있습니다. GPUImageRawDataOutput은 이미지 폭과 일치하지 않는 너비를보고 할 때 올바르게 처리합니다.

당신은 당신의 이미지 데이터가 glPixelStorei (GL_UNPACK_ROW_LENGTH)와 폭 보폭 다른있다 GL을 알 수