この事故は、常に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;
}
}
ポスト[、最小完全、かつ検証例](http://stackoverflow.com/help/mcve)。 – ybungalobill
コードが多すぎます。GPUImageRawDataOutputのデータを表示するためにkxMovieViewのコードを少し編集します。 GPUImageViewの出力は正しいです。 GPUImageRawDataOutputのデータに何が問題なのかを知りたい。 – Huangzy