对于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;
}
答案 0 :(得分:1)
GPU硬件可能需要与图像宽度不完全匹配的步幅。报告与图像宽度不匹配的宽度时,GPUImageRawDataOutput会正确处理。
您可以告诉GL您的图片数据与glPixelStorei的宽度不同(GL_UNPACK_ROW_LENGTH)