1

我喜欢使用片段着色器将简单的纹理渲染到 4 个顶点,并使用 glReadPixels 读取图像分辨率。我将(readPixel)大小设置为(源)图片大小,但我没有得到完整的图像。右侧总是有一个黑条。并且图像似乎被压缩了。

图像的返回部分是正确的。它显示了我的 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 类时,我得到了正确的图片尺寸,但分辨率错误,分辨率图像只包含雪,但侧面没有黑条。

有人知道这个错误的解决方案吗?

问候,克里特

4

1 回答 1

1

我已经解决了这个问题。错误出现在 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 变量而不是铸造元素时,一切正常。

克里基特

于 2012-09-13T11:32:28.097 回答