2013年11月22日 星期五

[openGL] glDrawPixels問題紀錄

只是想要筆記一下遇到的問題

int W = 200;
int H = 200; 
unsigned int data[3][W][H];
    for( size_t y = 0; y < W; ++y )
    {
        for( size_t x = 0; x < H; ++x )
        {
            data[0][x][y] = ( rand() % 255 ) * 255 * 255 * 255;
            data[1][x][y] = ( rand() % 255 ) * 255 * 255 * 255;
            data[2][x][y] = ( rand() % 255 ) * 255 * 255 * 255;
        }
    }

    glDrawPixels( W, H, GL_RGB, GL_UNSIGNED_INT, data );

    glutSwapBuffers();

原本不知道怎麼用

http://stackoverflow.com/questions/20056174/gldrawpixel-rgb-value-from-a-array

但是在這邊找到之後,複製下來回到自己的電腦做,對data的宣告做一下修改,用C++的方式

對他做動態記憶體配置,當W和H是200的時候,使用正常沒問題,但是在W和H都大於400的

時候,就會莫名出現access violate的runtime error,查了非常久都查不到,程式碼也看了很多

遍,仍然沒有找到BUG,完全不知道到底為什麼會這樣反正也不知道原因就來亂試看看好

了,所以我就把C++動態配置的方式改成C的動態記憶體配置,然後竟然就成功了,但是到現

在還是不懂為什麼會出現 access violate,看了很多國內外網站論壇,很像沒有人有這樣的問

題,倒是有人直接歸咎是 harward造成的,害我好擔心呢。

而除此之外仍然也可能遇上其他 access violate 的 runtime error,原因通常是原本的座標在矩陣轉

換運算出新座標後,算出來的座標超出視窗範圍,而你把超出範圍的pixel資訊存進 frame buffer

中,可能沒問題,但是在 drawpixels() 時,就會出現 access violate,所以座標範圍都要進行裁

切,裁切方式可以看 transformation。

最後,drawPixels 的第三個要注意的就是,確定好第三個參數到底是 GL_RGB 還是

GL_RGBA,可能平常的時候不構成問題,但是當畫面 reshape 之後,access violate 的情形可能

又會再次發生。

-----------------------------------------------------------------------------------------

bool setSubPixel(int x, int y, GLbyte R, GLbyte G, GLbyte B)
{
if (x < W - 1 && x > 0) {
if (y < H - 1 && y > 0) {
GLbyte *subp = subImage;
subp += ((y * W + x) * 4);
*subp = (GLbyte)R;
*(subp + 1) = (GLbyte)G;
*(subp + 2) = (GLbyte)B;
*(subp + 3) = (GLbyte)27;
return true;
}
} else return false;
return false;
}

// W 和 H 分別是視窗寬度和視窗高度

沒有留言:

張貼留言