2012-04-11 100 views
1

我喜歡用我的片段着色器渲染一個簡單的紋理到4個頂點並使用glReadPixels讀取圖像分辨率。我將(readPixel)大小設置爲(源)圖片大小,但是我沒有收到完整的圖片。右側總是有一個黑色的條。圖像似乎被壓縮了。iOS上的OpenGL ES - glReadPixels()返回圖像的邊上有一個黑條

圖像的返回部分是正確的。它顯示了我的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

+2

作爲一個建議,你可以嘗試使用我的框架:https://github.com/BradLarson/GPUImage已經有基於OpenGL ES 2.0着色器工作Sobel邊緣檢測的實現。它的手動調整速度比你在這裏找到的庫存執行速度快20倍。 – 2012-04-16 20:17:29

+0

嗨布拉德,我會嘗試你的框架,感謝您的鏈接位置。 – retinotop 2012-08-09 11:26:39

回答

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變量而不是鑄造元素時,一切正常。

krikit

相關問題