討論區快速選單
知識庫快速選單
掌握Salesforce雲端管理秘訣 軟體開發過程中有哪些資安漏洞? 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
glut 教學 - 把我的圖放到視窗上!!
更改我的閱讀文章字型大小
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 08:34:49
這一次要介紹的, 是使用 glDrawPixels() 來畫圖.

這個, 會用到
  "glut 教學 - 第一個視窗" 和
  "glut 教學 - 讀取 bmp圖檔"
請先看畢這兩個教學, 才開始這個.

由教學一, 我們得到了基本的 glut 視窗,
由教學二, 我們讀取到 bmp圖檔,
現在, 接著要做的, 就是要把 圖檔畫到視窗上.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 08:35:14
/////////////////////////
// glutTest03.cpp
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//


#include <stdio.h>

#include "glut.h"
#include "g_bmp.h"

GBmp bm0;

void display()
{
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glRasterPos2f( -bm0.w/640.0, -bm0.h/640.0 );
    glDrawPixels( bm0.w, bm0.h, GL_RGB, GL_UNSIGNED_BYTE, bm0.rgb );

  glutSwapBuffers();
}

void main()
{
  glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB );
  glutInitWindowSize( 640, 640 );
  glutCreateWindow( "hihi" );
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

  glutDisplayFunc(display);

  bm0.load( "blank.bmp" );

  glutMainLoop();
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 08:38:15
這個程式 ( glutTest03.cpp ), 會先讀進 blank.bmp, 然後把它畫到視窗的中央.

接著, 我會更詳細的交代部份 glut 的 function 的意思.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 08:55:09
glRasterPos2f( -bm0.w/640.0, -bm0.h/640.0 ); //決定畫圖的位置.
glDrawPixels( bm0.w, bm0.h, GL_RGB, GL_UNSIGNED_BYTE, bm0.rgb ); //實在畫圖的程序
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 08:58:50
如果你是初學 OpenGL, 可能你會疑惑, "為什麼 畫圖 和 畫圖的位置 會分在兩個不同的 function 去設定呢?"... ...

OpenGL 是 procedural 的模組, 根我們常用的 C++ Object 很不同的, 在 OpenGL 模組內, 它記錄著一大堆全域變數, OpenGL 載入時, 會同時把這些全城變數設成預設值, 如果你用不著的變數, 就讓它繼續是預設值, 不用管它就可以了.

因為 procedural 的關係, 你並沒有物件, 只有全域變數一大堆, 即是說, 如果你把變數改了, 其他會用這個變數的程序也會受影響. 請緊記.

glDrawPixels() 畫圖時畫到什麼位置, 由 OpenGL 之內的某個變數決定的, 要改這個, 你要使用 glRasterPos2f() 去改它.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 09:03:39
OpenGL 預設的座標系統,
  (1,1) 在視窗的右上方,
  (0,0) 在視窗中心,
  (-1,-1) 在視窗的左下方.

這個, 跟 microsoft 的視窗座標 是完全不同的, 請注意.


作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 09:06:42
glutInitWindowSize( 640, 640 ); // 設定視窗大小
  glutCreateWindow( "hihi" ); // 建立視窗, 並把 title 設為 "hihi"
  glutDisplayFunc(display); // 註冊負責顯示的 function
  glutMainLoop(); // 開始視窗的 message loop
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 09:09:47
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // 清空畫面

每次重畫畫面時, 你也需要先清空畫面, 每一次畫圖, 圖其實也是畫到顯示卡的, 在顯示卡之內, 有一個剛畫的圖的 buffer, 如果你不先清空這個, 你就會重複的複到畫面上, 情況就好像, 你在紙上用鉛筆畫東西, 畫完了之後, 沒刷掉就再畫一樣.

作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 09:32:16
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

這個, 是對應著 glDrawPixels 而來的, 因為效率考慮, 所以,

OpenGL 預設, 你給 glDrawPixels 的圖檔資料, 它的每一個 row 的大小 ( 以 byte 來算 ), 也是可以給 4 整除的.

假設你的圖檔是 150x150, 每一個 row 的大小就會是 150 * 3 = 450 , 450 不能被 4 整除的. 如果要強行把它換成可以被 4 整除, 一般的做法, 就是在每一個 row 多加 2 bytes 沒用途的資料 (這個步驟我們叫 padding ), 如此 450 就會變成 452, 452 就可以被 4 整除了.

但是, 每 row 大小, 需要是多少的倍數, 雖然預設了是 4, 但是, 你是可以把它改成 1, 2, 4, 8, 其中任意一個的, 如果你設成 1, 這麼你就可以不用管 padding 的問題了 ( 因為什麼整數也可以被 1 整除呀 ), 但是, 懶散的結果, 就是程式 run-time 時慢一點點.

最好的做法, 應該直接使用 寬 可被 4 整除的圖.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/18 上午 09:38:03
致 初學OpenGL的網友,

  ^^, 恭喜你, 竟然有心機看完這麼長的介紹, 到底... 得到什麼呢?... 就是... 一份功課 @@!!

功課一 :
 "載入最少三個圖檔, 畫在畫面上不同的位置"
作者 : m9235104(裕)
[ 貼文 17 | 人氣 2329 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/12/16 下午 10:02:47
你好:
     請問一下, 我執行的時候, 爲什麼視窗是一片黑, 圖好像沒有匯進來
     謝謝
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/12/16 下午 11:19:40
這個範例, 已經寫成了一段很長的時間, 不太可能是這個範例的問題, 你... 有沒有照著教學把所有的步驟完成呢?
作者 : yamaha962(電腦繪圖)
[ 貼文 4 | 人氣 677 | 評價 50 | 評價/貼文 12.5 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/9/13 下午 05:04:41
1>------ Build started: Project: 0913lkk, Configuration: Debug Win32 ------
1>Compiling...
1>test.cpp
1>c:\mfc\0913lkk\test.cpp(11) : fatal error C1083: Cannot open include file: 'g_bmp.h': No such file or directory
1>Build log was saved at "file://c:\MFC\0913lkk\Debug\BuildLog.htm"
1>0913lkk - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
這是什麼意思?
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/9/13 下午 08:04:29
這個範例, 需要兩個檔案, 分別是 g_bmp.h 和 g_bmp.cpp, 它們的內容可以在以下網址找到

glut 教學 - 讀取 bmp圖檔
http://www.programmer-club.com/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=opengl&id=774
作者 : xxxxxxxxxxxx(gggggg)
[ 貼文 4 | 人氣 149 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/6/8 下午 06:57:39
感謝版主的分享,我非常想學openGL,但是對於最基礎程式結構有點搞混了,為何每個cpp
都有void main(),我在編譯的時候會發生錯誤,是否可以請版主不吝說明整個程式的結構,
如果有圖說明就更能理解了,如有發言不當或冒犯,請您原諒我這無理的請求。
作者 : xxxxxxxxxxxx(gggggg)
[ 貼文 4 | 人氣 149 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/6/8 下午 06:57:50
感謝版主的分享,我非常想學openGL,但是對於最基礎程式結構有點搞混了,為何每個cpp
都有void main(),我在編譯的時候會發生錯誤,是否可以請版主不吝說明整個程式的結構,
如果有圖說明就更能理解了,如有發言不當或冒犯,請您原諒我這無理的請求。
作者 : acccat(acccat)
[ 貼文 7 | 人氣 767 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/2/8 下午 12:31:27
g_bmp.cpp
c:\documents and settings\acccat\my documents\visual studio 2005\projects\opengl\g_bmp.cpp(176) : fatal error C1010: 尋找先行編譯標頭檔指示詞時碰到未預期的檔案結尾。您的原始檔中是否忘了加上 '#include "stdafx.h"'?
glutTest01.cpp
c:\documents and settings\acccat\my documents\visual studio 2005\projects\opengl\gluttest01.cpp(10) : fatal error C1010: 尋找先行編譯標頭檔指示詞時碰到未預期的檔案結尾。您的原始檔中是否忘了加上 '#include "stdafx.h"'?
glutTest03.cpp
c:\documents and settings\acccat\my documents\visual studio 2005\projects\opengl\gluttest03.cpp(28) : fatal error C1010: 尋找先行編譯標頭檔指示詞時碰到未預期的檔案結尾。您的原始檔中是否忘了加上 '#include "stdafx.h"'?
正在產生程式碼...

請問我是缺了什麼檔嗎?
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/2/8 下午 03:10:52
stdafx.h 這個 header file 是 visual studio 的一個很奇怪的基制的一部份, 它假定你希望每個 .cpp 檔中都 include 了 stdafx.h, 所以編譯時每當發現 .cpp 檔沒有 include stdafx.h 都當成是錯誤. 這個 stdafx.h 的原意是用來放置全域定義的, 只是眼高手低, 手段愚蠢而已.

最大的問題是, 很多 visual studio 專案都預設使用這愚蠢基制, 而這就做成了很多初學者的困擾.

最簡易解決這問題的方法, 就是不要使用這愚蠢基制. 你只要在 專案設定 裡, 找出 Precompiled Header 的設定, 再設定它成 不要使用 就可以了. 你可以非常安心的這樣做的, 因為這基制並無任何實用功能.
作者 : manufacture(哈)
[ 貼文 15 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/5/19 上午 12:11:42
感謝大大教學
看室友再用這個看起來蠻有趣的
作者 : taker1986(taker1986)
[ 貼文 25 | 人氣 1385 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/3/31 下午 03:12:25
你還沒有引入glut.h,
是不是沒有glut安裝好呢,
還是路徑錯誤
像我是在include下新增一個GL資料夾,
把glut.h放在GL資料夾中,
所以我的include如下,
是不是你也這樣呢
#include <GL/glut.h>
作者 : taker1986(taker1986)
[ 貼文 25 | 人氣 1385 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/4/1 上午 10:35:01
如果我的影像是灰階影像
我應該怎麼改呢
謝謝
 板主 : 白老鼠(Gary)
 > OpenGL - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - OpenGL - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
OpenGL
1 白老鼠(Gary) 2720 
2 CROMAYEN2000 1530 
3 aming 500 
4 東昇 380 
5 PLAYER 120 
6 富伯 110 
7 qq 100 
8 NDark 80 
9 ozzy 60 
10 simula 60 
OpenGL
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.125