[英]OpenGL ES on iOS - glReadPixels() returns the image with a black bar on the side
我想使用片段着色器将简单的纹理渲染为4个顶点,并使用glReadPixels读取图像分辨率。 我将(readPixel)大小设置为((source)picture大小),但是没有得到完整的图像。 右侧始终有一个黑条。 并且图像似乎已压缩。
返回的图像部分正确。 它显示了我的sobel着色器的分辨率。 所以我不认为ReadPixel部分或SetImage部分存在一些错误。 但是我不知道
这是我设置图像源的方法:
-(void)setImageSource : (unsigned char*) image
{
static const GLfloat textureVertices[] =
{
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 1.0f,
1.0f, 0.0f,
};
static const GLfloat squareVertices[] =
{
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f
};
glGenTextures(1, &pictureTexture);
glActiveTexture(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, pictureTexture);
glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageHeight, imageWidth, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
}
这里是渲染纹理的部分:
-(void)render
{
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glViewport(0, 0, imageHeight, imageWidth);
[self presentFramebuffer];
}
这是回读分辨率的部分:
-(void)readPixels : (unsigned char*) dest
{
glReadPixels(0, 0, imageHeight, imageWidth, GL_RGBA, GL_UNSIGNED_BYTE, dest);
glDeleteTextures(1, &pictureTexture);
}
我不知道我在哪里出错。 我已经在这个论坛和khronos组论坛上进行了搜索,但是我没有为此找到解决方案(并且我没有找到具有相同错误描述的案例)。
也许另一个重要或令人困惑的信息-我也尝试将代码放入c ++类。 但是,当我使用EAGLContext走出Objective C类时,我得到了正确的图片大小,但分辨率错误,分辨率图像仅包含积雪,而侧面没有黑条。
有人知道该错误的解决方案吗?
问候,krikit
我已经解决了问题。 错误出在OpenGL ES视图的初始化中。 我在其中为initWithFrame创建矩形的部分。
CGRectMake(0.0f, 0.0f, applicationFrame.size.width, applicationFrame.size.height)
当我自己设置尺寸时,我在目的地得到了一张完整的照片,这是错误的尺寸。
渲染的图片上有雪的另一部分来自错误的数据类型。 当我将变量强制转换为GLuint时,它是不一样的,然后初始化一个新的GLuint变量并将其设置为值...但是我不知道为什么。
unsigned int j = 20
GLuint i = 20;
glReadPixels(0,0,j,(GLuint)j,GL_RGBA,GL_UNSIGNED_BYTE,pictureDest); 当我使用GLuint变量而不是强制转换的元素时,一切正常。
克里基特
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.