2016-10-27 1 views
-1

enter image description here
この事故は、常にimagegidthに問題があります。 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のデータを使用して1つのイメージを作成しています。
カメラのサイズが1280 * 720または640 * 480の場合はOKです。しかし1920 * 1080で、それは何か間違っています。
OpenGLビューでデータを表示するようにKxMovieViewを修正しましたが、それは同じ間違いです。次に、kxMovieViewを修正して、インターネットから取得した1つのイメージを表示します。これは問題ありません。
私は困惑しています!私はそれが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を伝えることができ

関連する問題