Re: [問題] openGL glDrawPixels 使用問題

看板C_and_CPP (C/C++)作者 (是人心在動...)時間16年前 (2010/05/12 00:01), 編輯推噓8(8041)
留言49則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《capucino (是人心在動...)》之銘言: : 標題: [問題] openGL glDrawPixels 使用問題 : 時間: Tue May 11 22:41:09 2010 : : GLubyte bmp[300][300][3]; : : for(int y=0;y<300;y++){ : for(int x=0;x<300;x++){ : bmp[x][y][0] = r[y][x]; : bmp[x][y][1] = g[y][x]; : bmp[x][y][2] = b[y][x]; : : } : } : glRasterPos2i(0,0); : glDrawPixels(300,300,GL_RGB,GL_UNSIGNED_BYTE,bmp); : : 原始圖為350*350 bmp : : 如果用上面的方式畫我可以畫正確的顏色,大小當然為300*300 : : 可是將所有300 改成301以上大小顏色就變了(也就是301*301~350*350) : : 請問一下怎麼會這樣呢? 謝謝 : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 60.249.246.54 : 推 VictorTom:大小顏色就變是怎麼個變法?? 有screen shot可以看嗎?? 05/11 22:52 我將大小設為301*301結果如下 http://www.badongo.com/cn/pic/9362092 : → VictorTom:另外, 把code裡所有的300用301~350代就會錯?? 你原始圖 05/11 22:53 : → VictorTom:是自己開檔的吧?? 存到自己的array後, drawPixel之前有 05/11 22:54 我是用BCB寫的 是將圖片用 Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName); 在用矩陣把RGB分別存起來 for(int y=0;y<height;y++) for(int x=0;x<width;x++) { int color = Image1->Canvas->Pixels[x][y]; r[y][x] = GetRValue(color); g[y][x] = GetGValue(color); b[y][x] = GetBValue(color); } : → VictorTom:先處理好padding的問題嗎?? glDrawPixel是假定bmp灌進 05/11 22:54 : → VictorTom:去的data全部是連續的喔....@_@" 05/11 22:55 : 推 QQ29:你應該不是用glaux讀BMP吧? 05/11 23:02 : → QQ29:我記得glaux只能讀 2^n的圖檔耶 05/11 23:02 我是用上面的方式讀圖的 : ※ 編輯: capucino 來自: 60.249.246.54 (05/11 23:52) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.249.246.54

05/12 00:09, , 1F
可是glaux我記得不能讀非2^n的檔耶
05/12 00:09, 1F

05/12 00:10, , 2F
不好意思,我不懂您的意思~~~
05/12 00:10, 2F

05/12 00:10, , 3F
就 圖檔大小要是2的n次方大小的才能讀 印象中是這樣
05/12 00:10, 3F

05/12 00:16, , 4F
喔喔~~讀檔似乎是沒問題,問題是畫圖地方
05/12 00:16, 4F

05/12 00:16, , 5F
因為他有時候正確有時候不正確,就像上面連結一樣
05/12 00:16, 5F

05/12 00:25, , 6F
他不是用glaux讀圖的, 那個LoadFromFile是BCB自己的VCL
05/12 00:25, 6F

05/12 00:25, , 7F
元件, 所以和glaux或什麼2^n應該沒什麼關係, 300也不是
05/12 00:25, 7F

05/12 00:25, , 8F
2^n的數....
05/12 00:25, 8F

05/12 00:27, , 9F
"我是用上面的方式" 我以為是說glaux XD sorry
05/12 00:27, 9F

05/12 00:29, , 10F
Gray Level是你自己轉的還是它自己突變成這樣的??
05/12 00:29, 10F

05/12 00:29, , 11F
這問題看起來就是mem裡讀或寫data的alignment錯亂掉了,
05/12 00:29, 11F

05/12 00:30, , 12F
你有設定 glPixelStoref 等相關的function嗎??
05/12 00:30, 12F

05/12 00:33, , 13F
沒有,是他自己錯亂掉
05/12 00:33, 13F

05/12 00:33, , 14F
http://0rz.tw/cDd0i 這個不曉得用不用得上....Orz
05/12 00:33, 14F

05/12 00:37, , 15F
預設似乎是glPixelStoref(GL_UNPACK_ALIGNMENT,4);
05/12 00:37, 15F

05/12 00:38, , 16F
因為我用320好像也可以,但這樣好像就沒辦法把原圖畫出來
05/12 00:38, 16F

05/12 00:38, , 17F
該怎麼辦呢?
05/12 00:38, 17F

05/12 00:38, , 18F
所以才會猜alignment是不是應該改掉XD 直接改1試試??
05/12 00:38, 18F

05/12 00:39, , 19F
因為300x3(byte)是4的倍數, 320也是, 但301x3不是, 所
05/12 00:39, 19F

05/12 00:39, , 20F
以你width x 3byte不足4byte倍數的都會錯, 把alignment
05/12 00:39, 20F

05/12 00:39, , 21F
改成1試試:) 不然那個圖看起來就是alignment爛掉了XD
05/12 00:39, 21F

05/12 00:42, , 22F
太水了~~~~可以了!!!!感謝感謝~~~
05/12 00:42, 22F

05/12 00:43, , 23F
現在要想辦法解決照片顛倒的問題了,目前好像逆時針90度
05/12 00:43, 23F

05/12 00:44, , 24F
是要改變座標系,還是將畫出來的圖旋轉回來呢?
05/12 00:44, 24F

05/12 00:53, , 25F
其實小弟我不知道原來glaux可以開圖, 只知道某些sample
05/12 00:53, 25F

05/12 00:53, , 26F
老是跟我argu少這個lib還.dll或者.h的還得另外找Orz
05/12 00:53, 26F

05/12 00:54, , 27F
圖逆時針轉了90度?? 你的bmp[][][]自己這樣子設的啊??
05/12 00:54, 27F

05/12 00:54, , 28F
你是 bmp[x][y][0~2] = r~b[y][x]; ㄟ?? 所以轉90度正常
05/12 00:54, 28F

05/12 00:55, , 29F
啊?? (雖然如果不是正方型的圖大概就會亂掉)
05/12 00:55, 29F

05/12 00:55, , 30F
恩恩~~我在想辦法解決~~~:)
05/12 00:55, 30F

05/12 00:56, , 31F
改成bmp[y][x][0~2]就好啦?? 這樣同一條水平scanline的
05/12 00:56, 31F

05/12 00:57, , 32F
資料都會連續的, 除非你有非這樣排列的需求, 那, GL那邊
05/12 00:57, 32F

05/12 00:58, , 33F
不知道glRotatef能不能對glDrawPixels作用, 不行就設成
05/12 00:58, 33F

05/12 00:58, , 34F
texture去貼吧, 只是好像繞一大圈的感覺@_@"
05/12 00:58, 34F

05/12 01:02, , 35F
我知道為什麼了 因為BCB 座標(0,0)在左上角
05/12 01:02, 35F

05/12 01:03, , 36F
Windows座標系的確是(0,0)在左上角, 可是你不是差90度@@
05/12 01:03, 36F

05/12 01:04, , 37F
然後openGL 是在左下角 x軸正往右 y軸正往上
05/12 01:04, 37F

05/12 01:04, , 38F
改成你剛剛那個之後就差了180度~~我剛剛發現的
05/12 01:04, 38F

05/12 01:05, , 39F
所以改成bmp[height-y][x][0~2]就ok了~~感謝感謝!!!
05/12 01:05, 39F
※ 編輯: capucino 來自: 114.33.193.111 (05/12 01:05)

05/12 01:06, , 40F
不曉得你是怎麼把GL畫的結果畫上BCB的, 我記得BMP的
05/12 01:06, 40F

05/12 01:06, , 41F
scanline可是最下面的一條出現在data的最前面喔@_@"
05/12 01:06, 41F

05/12 01:10, , 42F
我不太懂你的意思,我是將BCB結果畫到openGL的
05/12 01:10, 42F

05/12 01:10, , 43F
目前看起來沒什麼問題~~
05/12 01:10, 43F

05/12 01:12, , 44F
對不起我上面想錯了, 請不要理我....Orz
05/12 01:12, 44F

05/12 01:13, , 45F
只是, 應該是bmp[height-y-1][x][0~2]; 不然y會access
05/12 01:13, 45F

05/12 01:13, , 46F
超過array喔:)
05/12 01:13, 46F

05/12 01:15, , 47F
okok~~~~: )
05/12 01:15, 47F

05/12 01:22, , 48F
剛發現我完全忘了glDrawPixels是由lower-left corner開
05/12 01:22, 48F

05/12 01:23, , 49F
始畫這件事....囧rz
05/12 01:23, 49F
文章代碼(AID): #1BwNz34V (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BwNz34V (C_and_CPP)