計算機圖形學(OpenGL版)-第一個OpenGL程序


獲取和安裝了OpenGL之后,就可以寫第一個OpenGL程序了。雖然Helloj2ee在獲取和安裝OpenGL非常順利。但是實際中大家會遇到不同的問題。具體說來主要有以下兩個問題。

1、按照上一篇的步驟,VS運行OpenGL程序仍然找不到glut.dll和glut32.dll。這個問題主要是操作系統不一樣。64位操作系統,需要將這兩個dll安裝到系統目錄syswow64目錄下。

2、lib放置的問題。仍然是部分機器,會存在Program File以及Program Files(x86)目錄,您的VS多半會在后一個目錄,因此需要找到相應的VS2010安裝目錄的lib文件夾下。比如Helloj2ee的機器lib的路徑是C:\Program Files\Microsoft Visual Studio 10.0\VC\lib,您也可能是C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\lib。

當然Helloj2ee還遇到了同學不知道安裝目錄到底在哪兒。呃。這Helloj2ee就無能為力,回天乏術了。

一切順利,您可以開始寫第一個OpenGL程序了,程序代碼如下圖所示。

#include <windows.h>   
#include <gl/Gl.h>
#include <gl/glu.h>
#include <gl/glut.h>

//<<<<<<<<<<<<<<<<<<<<<<< myInit >>>>>>>>>>>>>>>>>>>>
 void myInit(void)
 {
    glClearColor(0.0, 0.0, 0.0, 0.0);      // 設置背景顏色為亮白
    glColor3f(1.0f, 1.0f, 1.0f);           // 設置繪制顏色為黑
     glPointSize(4.0);                    //設置點的大小為4*4像素
    glMatrixMode(GL_PROJECTION);// 設置合適的投影矩陣-以后解釋 
    glLoadIdentity();// 以后解釋
    gluOrtho2D(0.0, 640.0, 0.0, 480.0);// 以后解釋
 }
//<<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>>
// 重繪函數
void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);     // 清屏幕 
    glBegin(GL_POINTS);
        glVertex2i(100, 50);         // 繪制若干個點
        glVertex2i(100, 130);
        glVertex2i(150, 130);
    glEnd();    
    glFlush();                         // 將所有輸出到顯示屏上 
}
//<<<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>>
void main(int argc, char **argv)
{
    glutInit(&argc, argv);          // 初始化工具包
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 設置顯式模式
    glutInitWindowSize(640,480);     // 設置窗口大小
    glutInitWindowPosition(100, 150); // 設置窗口位置
    glutCreateWindow("my first attempt"); // 打開屏幕窗口
    glutDisplayFunc(myDisplay);     // 注冊繪制函數
    myInit();                   
    glutMainLoop();              // 進入主循環
}

 

 

Helloj2ee逐一解釋一下。但凡gl開頭的函數都是opengl的gl庫,glu開頭的函數都是glu庫,glut開頭的函數都是glut庫,其他除main外,就是Helloj2ee操刀寫的函數。除去親自操刀寫的函數不解釋外,其他Helloj2ee都略做解釋。

glutInit(int *argcp, char **argv)

該函數初始化工具包,其參數是傳送有關命令行信息的標准參數。

glutInitDisplayMode(unsigned int mode)

該函數指明顯式屏幕窗口如何被初始化。內置常數GLUT_SINGLE和GLUT_RGB是或的關系,表明應分配單個顯式緩存(相對雙緩存),而且顏色所需的紅、藍、綠三色的數量來指定。

glutInitWindowSize(int width, int height)

該函數指定顯式屏幕窗口的初始尺寸,示例中寬640像素,高480像素。程序運行時,用戶可以根據需要調整窗口大小。

glutInitWindowPosition(int x, int y)

該函數指定窗口在屏幕上相對於左上角的位置,示例中距左邊100個像素,距頂端150個像素。程序運行時,用戶可以根據需要移動窗口。

glutCreateWindow(char* name)

該函數打開並顯式屏幕窗口,示例中是將標題設置為了“My First Attempt”。

 glutDsiplayFunc(void (*func)(void))

無論系統何時決定重畫一個屏幕窗口,它都會發出一個重新繪制事件。出現下列情況之一,就會發生該事件:第一次打開窗口,或覆蓋它的窗口被移走而露出該窗口。示例中函數myDisplay()在這里被注冊為重新繪制事件的回調函數。

glutMainLoop()

執行這個函數時,程序繪制完初始圖形,並進入循環,一直等待事件發生。用鼠標單擊關閉窗口按鈕,程序正常終止。

 glBegin(GLenum mode)和glEnd()

繪制函數應該處於這兩個函數之間,示例中GL_POINTS內置於OpenGL中。如果需要繪制點集合、線集合以及多邊形,可以傳遞GL_POINTS,GL_LINES以及GL_POLYGON等。

 

OpenGl函數命名非常有規則,以glvertex2i為例,gl  代表gl庫,Vertex 代表基本命令,2 參數數目,i 參數類型,OpenGL用到的參數類型如下所示。

參數類型

后綴

數據類型

典型的CC++類型

OpenGL類型名

b

8位整型

signed char

GLbyte

s

16位整型

short

GLshort

i

32位整型

int 或long

GLint,GLsizei

f

32位浮點型

Float

GLfloat,GLclampf

d

64位浮點型

double

GLdouble,GLclampd

ub

8位無符號整型

unsigned char

GLubyte,GLboolean

us

16位無符號整型

unsigned short

GLushort

ui

32位無符號整型

unsigned int或unsigned long

GLuint,GLenum,GLbitfield

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM