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;
}
}
올리기 [, 최소를 완료하고 검증 가능한 예 (http://stackoverflow.com/help/mcve). – ybungalobill
코드가 너무 많습니다. GPUImageRawDataOutput의 데이터를 표시하기 위해 kxMovieView의 코드 만 편집합니다. GPUImageView의 출력 결과가 맞습니다. 그래서 GPUImageRawDataOutput의 데이터가 무엇인지 잘못 알고 싶습니다. – Huangzy