2013-06-22 90 views
0

我想翻轉glReadPixel的輸出圖像。我已經通過將它保存到一個文件來檢查glReadPixels的輸出。圖像是正確的,但是它的倒置。翻轉glReadPixels的RGBA輸出(C++ OpenGL)

我試過

int patchSize = 50; 
std::vector<unsigned char> rgbdata(4*patchSize*patchSize); 
glReadPixels(x-(patchSize/2), y-(patchSize/2)/2), patchSize,patchSize,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]); 

std::vector< unsigned char > temp_rgbdata = rgbdata; // Create a copy of the data 
    rgbdata.clear(); // Reset the array 
    for (int i=patchSize-1; i >= 0; i--) // Count backwards in order to flip 
    { 
     for(int j = 0; j < patchSize; j++) { 

      rgbdata.push_back(temp_rgbdata[i*patchSize+j*4]); 
      rgbdata.push_back(temp_rgbdata[i*patchSize+j*4+1]); 
      rgbdata.push_back(temp_rgbdata[i*patchSize+j*4+2]); 
      rgbdata.push_back(temp_rgbdata[i*patchSize+j*4+3]); 

     } 
    } 
    temp_rgbdata.clear(); // Clear the temporary array 

什麼是錯的

的圖像原來都是錯誤的:

Output from trying to flip image

任何幫助和意見是值得讚賞。謝謝。

溶液(鮑里斯)

int patchSize = 50; 
std::vector<unsigned char> rgbdata(4*patchSize*patchSize); 
glReadPixels(x-(patchSize/2), y-(patchSize/2)), patchSize,patchSize,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]); 

std::vector< unsigned char > temp_rgbdata = rgbdata; // Create a copy of the data 
    rgbdata.clear(); // Reset the array 
    for (int i=patchSize-1; i >= 0; i--) // Count backwards in order to flip 
    { 
     for(int j = 0; j < patchSize; j++) { 

      rgbdata.push_back(temp_rgbdata[(i*patchSize+j)*4]); 
      rgbdata.push_back(temp_rgbdata[(i*patchSize+j)*4+1]); 
      rgbdata.push_back(temp_rgbdata[(i*patchSize+j)*4+2]); 
      rgbdata.push_back(temp_rgbdata[(i*patchSize+j)*4+3]); 

     } 
    } 
    temp_rgbdata.clear(); // Clear the temporary array 

回答

1

你需要所有這些行括號:

temp_rgbdata[ (i*patchSize+j)*4 ] 

順便說一句,你可以通過更有效的:

  1. 將上下圖像放入臨時數組(避免無用的副本)

  2. 最終尺寸的初始化rgbdata和一次複製一整行:

這裏是你會怎麼做:

int patchSize = 50; 
std::vector<unsigned char> temp_rgbdata(4*patchSize*patchSize); 
glReadPixels(x-(patchSize/2), y-(patchSize/2)),patchSize,patchSize,GL_RGBA,GL_UNSIGNED_BYTE, &temp_rgbdata[0]); 

std::vector< unsigned char > rgbdata(4*patchSize*patchSize); 
for (int i=0; i < patchSize; i++) // Doesn't matter the order now 
    memcpy(&rgbdata[i*patchSize*4],     // address of destination 
      &temp_rgbdata[(patchSize-i-1)*patchSize*4], // address of source 
      patchSize*4*sizeof(unsigned char));  // number of bytes to copy 

temp_rgbdata.clear(); // Clear the temporary array 
+0

這是導致問題的括號。額外的'/ 2'是一個錯誤。我也減去點的大小,但不想在這裏包括它。謝謝。 –

+1

@Købmanden不客氣。 :-)我也在我的答案中加了一條提示;-) – Boris

+0

整潔!獲取幫助和提示:) –

3

你確定你正在閱讀和/寫入到正確的座標系?以下是從OpenGL.org採取:

有關2D渲染具有左上角座標系統API的另一個常見的缺陷是2D圖像的文件格式在頂部掃描線,而不是底部的掃描線開始圖像。 OpenGL假定圖像默認從底部掃描線開始。如果渲染時確實需要翻轉圖像,則可以使用glPixelZoom(1,-1) 。

如果您保存的圖像總是出現顛倒,這可能是什麼問題。確保你知道你的(0,0)像素在哪裏(左上角或左下角),然後相應地調整你的圖像算法。

+0

+1它沒有回答爲什麼翻轉代碼不起作用,但刪除了首先翻轉的需要;-) – Boris

+1

事實上,glPixelZoom不能與glRead一起使用,只有glWrite,無論如何都被棄用。所以+1只是爲了這個想法:試圖讓圖像不顛倒是最好的策略。 – Boris

+1

好點。我在幾周前發佈了一個問題,我遇到了同樣的問題。我的紋理顛倒的物體上。我通過在頂點着色器中翻轉圖像來解決這個問題,但是現在這個問題累積了,所以我應該在加載時適當地找到改變圖像的方法。 –