[問題] OpenGL 是否有延遲的功能 ?

看板C_and_CPP (C/C++)作者 (Cory)時間14年前 (2011/12/10 02:32), 編輯推噓5(5026)
留言31則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Code::Blocks / MinGW 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenGL GLUT 問題(Question): 小弟目前剛學 OpenGL (三天) 想用來跑 2D 平面繪圖 (簡單的動畫) 我想連續輸出畫面 但是中間要暫停個0.1秒 不然跑太快閃過去就沒了 只剩最後一張圖而已 我自己想說用 _sleep(100) 這樣子的功能去暫停 但結果是暫停時間內整個程式會當掉不用動 還是沒辦法達成動畫的效果 程式碼(Code):(請善用置底文網頁, 記得排版) http://pastie.org/2992365 補充說明(Supplement): 成功的話 應該會看到色點往四個角落移動 不過實際上只會看到最後的點而已 中間的過程都不見了 麻煩各位高手們看看能不能給點提示 感謝 ~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.221.54

12/10 02:49, , 1F
小弟我用VC2005試了一下, 色點是會往四個角落移動啊....
12/10 02:49, 1F

12/10 02:53, , 2F
把glColor()裡傳i的部份都加個0.1或0.2, 並且一開始先用
12/10 02:53, 2F

12/10 02:53, , 3F
glPointSize()給個10.0, 效果看起來很明顯啊....
12/10 02:53, 3F

12/10 06:40, , 4F
要慢一點的話就glutTimerFunc + glutPostRedisplay
12/10 06:40, 4F
謝謝兩位 程式小修改後大致上可以跑 但是不知道為什麼 跑兩次就自己停掉了 不會無限循環下去 然後視窗感覺還是盪盪的 ※ 編輯: cory8249 來自: 140.114.221.54 (12/12 21:24)

12/12 21:29, , 5F
gultTimerFunc裡面每次都要設定下一次的timerFunc才會迴圈
12/12 21:29, 5F

12/12 21:29, , 6F
找個範例來看應該就懂了
12/12 21:29, 6F

12/12 21:31, , 7F
當當的感覺我猜是fps太低? timerFunc的頻率設短一點即可
12/12 21:31, 7F
關於 TimerFunc 這部分 我在網路上看來看去還是不太明白 亂改的程式碼: http://pastie.org/3005736 會呈現一直在重繪的情況 還是沒有 delay @@" ※ 編輯: cory8249 來自: 140.114.221.54 (12/13 00:04)

12/13 00:19, , 8F
你是要一直重覆從裡到外的過程, 還是只要一次裡到外但是
12/13 00:19, 8F

12/13 00:20, , 9F
慢慢畫? 你的設計裡Timer每隔段時間call PostRedisplay,
12/13 00:20, 9F

12/13 00:21, , 10F
然後display func裡都是從裡到外畫完一次的全程, 自然你
12/13 00:21, 10F

12/13 00:21, , 11F
看到最後的結果就是一直重繪從裡到外的流程....
12/13 00:21, 11F

12/13 00:22, , 12F
如果你只是要一次慢慢畫的過程, 簡單作法就是display裡
12/13 00:22, 12F

12/13 00:23, , 13F
那個for直接拿掉, 把i提成global變數, 然後原本for裡的
12/13 00:23, 13F

12/13 00:23, , 14F
條件判斷與i+=0.01這些都拉進Timer裡(PostRedisplay前)
12/13 00:23, 14F

12/13 00:28, , 15F
另外, 總覺得display裡最後兩行clear相關的是不需要的.
12/13 00:28, 15F

12/13 00:31, , 16F
還有, TimerFunction() 好像應該從display裡拉到main裡.
12/13 00:31, 16F
對不起 我資質駑鈍 弄一弄都變成全黑一片 我想做到以下兩點: 1. 像 _sleep() 這樣的延遲功能 就是每次畫一次小方塊之後 都短暫停個 0.2 秒 (舉例來說) 然後下一次 小方塊的位置、顏色都改變之後 再把它畫出來 也就是方塊會慢慢變亮、從內移往外移動 , 像動畫那樣 clear那邊如果不打 他會全部連在一起 變成一條線 我是想要方塊移動的樣子 2. 以上流程可以一直重複的跑 若鍵盤輸入 p 就暫停 輸入 r 回復播放動畫 輸入 q 或者 ESC 之類的才結束 Thanks !! ※ 編輯: cory8249 來自: 140.114.221.54 (12/13 02:02)

12/13 10:23, , 17F
你如果要用Sleep, 就不需要搞Timer, 而我這邊試再前一次
12/13 10:23, 17F

12/13 10:23, , 18F
的版本就已經會從裡到外跑了....
12/13 10:23, 18F

12/13 10:23, , 19F
一般的設計會是display只畫一個frame, 然後等Timer到或
12/13 10:23, 19F

12/13 10:24, , 20F
需要ReDraw的時候才clear, 然後render frame內容....
12/13 10:24, 20F

12/13 10:26, , 21F
你的設計裡是display裡把動畫的所有frame都畫完, 所以
12/13 10:26, 21F

12/13 10:27, , 22F
clear, render, timer全攪和在一起了, 你可能要想想你的
12/13 10:27, 22F

12/13 10:28, , 23F
你想要做的與目前你的程式實際運行的流程再作修改....
12/13 10:28, 23F

12/13 10:28, , 24F
最後要收key event, 可以查 glutKeyboardFunc 的用法.
12/13 10:28, 24F

12/13 10:34, , 25F
這是小弟我改過的Timer版: http://pastie.org/3008420
12/13 10:34, 25F

12/13 10:38, , 26F
原來的迴圈加Sleep版: http://pastie.org/3008431
12/13 10:38, 26F

12/13 10:38, , 27F
迴圈版我懶得改成一直loop跑了, 反正多掛一層loop的事;
12/13 10:38, 27F

12/13 10:39, , 28F
每個Point的Color我都多加了0.2, 不然不容易看出來結果.
12/13 10:39, 28F

12/13 10:39, , 29F
Key event的等你自己搞清楚試了有問題再說吧....
12/13 10:39, 29F
原來如此 ... 感謝 V大 詳細的講解 不過我還是不太清楚 void TimerFunction(int value); 還有 glutTimerFunc(millisecond,TimerFunction, value); 他的引數 value 是做什麼用的? (這邊看似沒用到 ?) 然後 關於整個 glut 的流程 感覺還是一知半解 我另外加了一個三角形 http://pastie.org/3009372 如果想要兩個輪流 (或者同時) display 該怎麼做 ? glutPostRedisplay() 是重播哪個函數 ? ※ 編輯: cory8249 來自: 140.114.221.54 (12/13 17:09)

12/13 22:14, , 30F
你需要去查一下你提到與寫到的所有函數的使用說明....
12/13 22:14, 30F

12/13 22:15, , 31F
http://0rz.tw/qpoVX 搭配google應該也能找到些例子.
12/13 22:15, 31F
官方說明文件有看過幾遍了 不過小弟程度粗淺 不慎明白 @@" 這部分我再慢慢 google 看看好了 這幾天麻煩 V大 了 真是非常感謝 !! ※ 編輯: cory8249 來自: 140.114.221.54 (12/14 03:04)
文章代碼(AID): #1EubG_rg (C_and_CPP)
文章代碼(AID): #1EubG_rg (C_and_CPP)