You are on page 1of 8

OpenGLÊÇʲô£¿OpenGLÖ»ÊÇÒ»¸ö3DͼÐο⣬×îÔçÓÉSGI—¢Æð£¬Ä¿Ç°ÓÉkhronos groupά»¤¡£±¾ÖÊÉÏÎÒÃÇÏÔÊ

ÓÉÓÚOpenGL²¢²»ÊÇÒ»¸ö´°¿Úϵͳ£¬ËùÒÔ½«OpenGLµÄÊä³öËÍÖÁ±¾µØ´°¿ÚϵͳÏÔʾÊÇÒòƽ̨¶øÒìµÄ¡£µ«ÖÁÉÙÄ
ÔõÑù»ñÈ¡OpenGL£¿ÓÉÓÚOpenGL±ê×¼µÄÖƶ¨Õß½ö½öÊǶ¨ÒåÁ˹时£¬ËùÒÔÕæÕý¿ÉÒÔÓÃÓڱ།¿ª—¢µÄOpenGL¶þ½
ÓÉÓÚOpenGL¶ÔÉÏÐèÒª´°¿ÚϵͳÌṩ֧³Ö£¬¶ÔÏÂÐèÒªOS, Çý¶‾Ìṩ֧³Ö£¬ËùÒÔÒ»¸öOpenGLÔÚÒ»¸öƽ̨Éϵı
ËäÈ»OpenGLÊÇ¿çƽ̨µÄ£¬µ«Óйý±àд¿çƽ̨Èí¼þ¾ÑéµÄÈ˶¼ÖªµÀ£¬ÕæÕýÏ뿪—¢Ò»¸ö¿çƽ̨µÄ3DÓ¦ÓóÌÐò£
glut×îÔçÊÇMark KilgardÓÃÓÚredbookµÚ¶þ°æÖеÄÑùÀýд×÷ʱ¶ø¸ã³öµÄÒ»Ì×½Ó¿Ú£¬¼ò»‾¸÷ƽ̨ÉÏopenglÓë
ʹÓÃglut¿ª—¢Ò»¸öOpenGL³ÌÐòµÄ²½ÖèÈçÏ£º
//³õʼ»‾glut
glutInit(&argc, argv);
//ÉèÖÃglut(¿ÉÑ¡)
...
//´´½¨´°¿Ú²¢ÓëOpenGL°ó¶¨
glutCreateWindow(argv[0]);
//ÉèÖûæͼ»Øµ÷º‾Êý£¨Ï൱ÓÚ´¦ÀíWM_PAINT£©
glutDisplayFunc(display);
//ÉèÖÃÖØ»æ»Øµ÷º‾Êý£¨µ±´°¿Ú³ß´ç—¢Éú¸Ä±äʱ£©
glutReshapeFunc(reshape);
//Æô¶‾ÏûϢэ»—
glutMainLoop();
Ò»¸ö³¡¾°ÖдæÔÚ¶à¸öÔªËØ£¬²»ÂÛ3D»¹ÊÇ2D¶¼ÊÇÒ»Ñù¡£µ«ÓÉÓÚ3D¶à³öÒ»¸öZÖᣬÒò¶øÈËÑÛ´Ó²»Í¬½Ç¶È¹Û²ìµ½
ÔÚ3D¼ÆËã»úͼÐÎÊÀ½çÀËùÓÐͼԪ¶¼Í¨¹ý¶¥µã(vertex)À´±íʾ¡£OpenGLÖ§³Ö(x,y), (x,y,z), (x,y,z,w)
ÒÔÇ°½Ó´¥µÄһЩͼÐοâÔÚÃèÊö×ø±êʱ¶¼ÓõÄÊÇÕûÊý£¬ÓÃÕûÊýÓÐÒ»¶¨µÄºÃ´¦£¬ÌرðÊÇÔÚǶÈëʽÖУ¬¶ÔÓÚÄÇÐ
¹âÓж¥µã»¹²»×ãÒÔÃèÊöÒ»¸öͼԪ£¬»¹ÐèÒªÖ¸Ã÷ÕâЩ¶¥µãËù¹¹³ÉµÄͼԪÀàÐÍÊÇʲô¡£OpenGLÖ§³ÖÖ±Ïß¡¢Èý½
ÔÚOpenGLÀïʹÓö¥µãºÍͼԪÀàÐÍÀ´¶¨ÒåͼԪµÄ—½—¨ÈçÏ£º
glBegin(GL_LINES);
//define vertex
glVertex2f(0.0, 0.0);
glVertex2f(1.0, 1.0);
...
glEnd();
ÆäÖÐGL_LINESÊÇͼԪÀàÐÍ£¬glVertex2f¶¨ÒåÒ»¸ö¶þά¶¥µã¡£glBegin/glEnd±íʾͼԪ¶¨ÒåµÄ¿ªÊ¼ºÍ½áÊø¡£
µ±È», glVertex2fÒ²»¹¿ÉÒÔÊÇglVertex3f, glVertex2iÖ®ÀàµÄ¡£×ÜÖ®£¬OpenGL APIÊÇÎÒ¼û¹ýµÄ×î±ðŤµÄA
À´ÍêÉÆÒ»ÏÂ×òÌìµÄÀý×Ó£¬°Ñdisplayº‾ÊýʵÏÖÁË¡£
static void display(void)
{
glClearColor(0, 0, 0, 1); //ÉèÖÃÇåÆÁËùÓõÄÑÕÉ«(RGBA)
glClear(GL_COLOR_BUFFER_BIT); //ÇåÆÁ, GL_COLOR_BUFFER_BIT±íʾÇåÆÁ¶‾×÷
glColor3f(0, 1, 0);
glBegin(GL_LINES);
glVertex2f(0, 0);
glVertex2f(100, 100);
glEnd();
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

Èç¹û²»³öÒâÍ⣬Ӧ¸Ã¿ÉÒÔ¿´¼ûÒ»ÌõÂÌÉ«µÄбÏßÁË¡£
OpenGLÊǸö״̬»ú£¬Àí½âÕâÒ»µãºÜÖØÒª£¬OpenGL API¸üÊÇÑϸñµÄÇø—Ö×ÅÊý¾ÝÅäÖúÍÃüÁîÅäÖÃÁ½ÖÖ½Ó¿Ú¡£Ê
Èç¹ûÿ¸ö¶¥µã¶¼ÒªÓÃglVertexÕâÑùÈ¥ÊäÈ룬ÄǶÔÓÚ¶‾éü¼¸Ç§¸ö¶à±ßÐεÄÄ£ÐÍÀ´Ëµ£¬¿ÖÅÂÿһ֡¼¸Ç§´Îº‾Ê
Ò»¸ö±È½ÏÈÝÒ×Ïëµ½—½—¨ÊǰѶ¥µã—ÅÔÚÒ»ÆðÈ»ºóÓÃÒ»¸öÃüÁ¶¥µãÊý×éµÄÊ×µØ֗ÅäÖøøOpenGL¡£µ±È»OpenG
ʹÓÃÊý×éÅäÖ׽ʽÓÐÁ½¸ö²½Ö裬
1. ʹÓÃglEnableClientState£¬²¢´øÉϱê־룬±íʾÆôÓÃijÖÖÊý¾ÝµÄÊý×éÅäÖ׽ʽ£¬—ñÔò¾ÍÖ»ÄÜʹÓõ¥µ
2. glVertexPointerµÈº‾ÊýÀ´ÅäÖÃÌض¨ÀàÐ͵ÄÊý×é¸øOpenGL¡£
ÅäÖÃÍê³ÉÖ®ºó¾ÍÊÇÈçºÎÒýÓÃÁË¡£ÓÐÁ½Ö֗½Ê½£¬Ò»ÖÖÊǵ¥¸öË÷Òý—½Ê½£¬ÁíÒ»ÖÖÊÇË÷ÒýÊý×闽ʽ¡£
µ¥¸öË÷Òý—½Ê½Ê¹ÓÃglArrayElement£¬Ö¸¶¨Ë÷Òýºó£¬»á×Ô¶‾°ÑÏàÓ¦Ë÷ÒýµÄ¶¥µã£¬ÑÕÉ«µÈÊý¾Ý¶¼ÅäÖøøOpenG
¸ü¿ì½ÝµÄÒýÓ׽ʽÊÇʹÓÃË÷ÒýÊý×é¡£¼´°ÑÒ»¸ö¶à±ßÐεĶ¥µãµÄË÷Òý—ÅÔÚÒ»¸öÊý×éÀȻºóͨ¹ýglDrawEle
¸ü½üÒ»²½£¬°Ñ¶à¸öglDrawElementsµ÷ÓÃËùÐèµÄË÷ÒýÊý×éÔٗŵ½Ò»¸öÊý×éÀʹÓÃglMultiDrawElementsÅä
ÓÐÁËÕâЩ¼òµ¥µÄÅäÖ׽ʽ֮ºó£¬ºÜÄÑÏëÏñΪʲô»¹ÒªÓÃԍʼµÄ—½Ê½ÁË¡£
½ñÌìÑо¿Í¶Ó°»¨Á˺öàʱ¼ä£¬ºóÁ˗¢ÏÖ×Ô¼º×ßÁËÍä—£¬ÔٴθÐ̾—½—¨ºÍ½»Á÷ÊǶàôÖØÒª¡£¹ØÓÚͶӰµÄÄÚÈ
ͬÑùÊÇÑо¿Í¶Ó°Ê±£¬Í»È»—¢ÏÖԍÀ´ÂòÀ´Ò»Ö±Ã»¿´µÄ¼¸±¾Ê飨¡¶¼¸ºÎԍ±¾¡—¡¢¡¶ÊýѧÊֲᡗ£¬»¹ÓÐÈô¸É¹ØÓ
¾ÃÎ¥ÁË£¬ÎÒµÄblog¡£Õ⼸Ì챻͸ÊÓͶӰ¿¨×¡ÁË£¬ËäÈ»µ½ÏÖÔÚҲûÓÐÍêÈ«¸ãÃ÷°×£¬µ«Ò²»¹ÊÇÓ¦¸Ã½×¶ÎÐÔ×ܽ
3DͼÏñÔÚ2DƽÃæÏÔʾҪ¾¹ýÒÔϼ¸¸ö²½Ö裬
1. Êý¾ÝÅäÖû—½Ú£¬ÅäÖö¥µã¡¢ÑÕÉ«µÈÊý¾Ý£¬È—¶¨ÁËÎïÌåµÄ´óСºÍÍâ¹Û¡£
2. Ö¸¶¨Ä£ÐÍÊÓµã±ä»»²ÎÊý£¬½«ÎïÌåµ½3D³¡¾°ÖУ¬²¢È—¶¨ÎÒÃǵĹ۲ìµã£¬Ò²¾ÍÊÇÈËÑÛµÄλÖá£
3. Ö¸¶¨Í¶Ó°±ä»»²ÎÊý£¬È—¶¨Í¶Ó°—½Ê½ºÍ—½Ïò¡£
4. Ö¸¶¨Êӿڱ任²ÎÊý£¬½«Í¶Ó°½á¹ûÓ³ÉäÖÁÊÓ¿Ú£¨2DÏÔʾƽÃ棩¡£
ÒÔÉÏ4²½¶¼ÊôÓÚÅäÖö‾×÷£¬—Ö±ðÓÃÓÚÐÞ¸ÄOpenGL״̬»úÖеIJ»Í¬ÅäÖòÎÊý£¨¶¥µãÊý×飬±ä»»¾ØÕóµÈ£©£¬Õæ
2,3,4ÖÐÉæ¼°µÄ¸÷Öֱ任¶¼ÊÇͨ¹ý¾ØÕóÀ´±íʾµÄ£¨ÕâÀïÓÐÌ«¶àÊýѧ֪ʶ£¬ÔÙµ¥¶À×ܽá°É£©£¬ºÍ¸÷ÖÖÊý¾Ý»º
1.¡¡Ä£ÐÍÊÓµã±ä»»
Ä£ÐÍÊÓµã±ä»»£¬Òà¿É—Ö±ð³ÆΪÊÓµã±ä»»¡¢Ä£Ðͱ任£¬µ«ÓÉÓÚÁ½Õß¹Øϵ±È½ÏÃÜÇУ¬ËùÒÔÒ»°ã»áÁ¬ÔÚÒ»Æð˵¡
Ä£Ðͱ任Ïà¹ØµÄº‾ÊýÓУ¬glRotate*£¨Ðýת£©£¬glTranslate*£¨Æ½ÒÆ£©£¬glScale*£¨Ëõ—Å£©µÈµÈ¡£¡£
¶ÔÓÚÊÓµã±ä»»OpenGL²¢Ã»ÓÐÌṩרÃŵĺ‾Êý£¨Õâ¸üÌåÏÖÁËÄ£ÐÍÊÓµã±ä»»µÄ»¥»»ÐÔ£©£¬µ«ÔÚgluÀïÌṩÁËgl
ÄÃÅÄÉãÀ´±ÈÓ÷£¬½ö¸Ä±äµÚÒ»×é²ÎÊý±íʾÏà»úÈÆÎïÌåÒƶ‾£¬½ö¸Ä±äµÚ¶þ×é²ÎÊý±íʾÏà»úԍµØת¶‾£¨ÔÚxozƽ
2. ͶӰ±ä»»
ͶӰ(projection)µÄÄ¿µÄÊǽ«3DͼÐÎת»»ÖÁ2DƽÃæÏÔʾ¡£OpenGLÌṩÁËÕý½»Í¶Ó°(orthogonal projectio
͸ÊÓͶӰµÄÄ£ÐͶ¨ÒåÁËÒ»¸öÊÓ¾°Ì壬ÕâÊÇÒ»¸öƽ½Ø͗Ì壨µ¹—ŵÄÀą̂£©£¬ËùÓÐÔÚÕâ¸öÊÓ¾°ÌåÄÚµÄÎïÌå²Å»
OpenGLÌṩÁËglFrustum½Ó¿ÚÀ´ÊµÏÖ͸ÊÓͶӰ£¬Õâ¸öAPIÍêÈ«ÊÇÒÔÊÓ¾°ÌåÄ£ÐÍÀ´¶¨ÒåµÄ£¬Èç¹û¾õµÃÓÃÆðÀ´²
3. Êӿڱ任
ÊÓ¿Ú¿ÉÒÔÀí½âΪ×îÖÕÔÚÏÔʾÆ÷ÉÏÏÔʾµÄ´óС£¬ËäȻһ°ãÀ´Ëµ¾ÍÊÇOpenGL´°¿ÚµÄ´óС£¬µ«ÀíÂÛÉÏÁ½Õß²¢²»Ò

ÏëÒªÕæÕýÕÆÎÕÕâЩ¸ÅÄ»¹ÐèÒªÇ××Ôʵ¼ù£¬Ð´¶Î´úÂëÀ´Ìå»áһϡ£
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 0, colors);
glVertexPointer(3, GL_INT, 0, vetices);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, front);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, end);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, left);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, right);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, top);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, bot);
glFlush();
}
static void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (GLfloat)w/(GLfloat)h, 0.1f, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//ÑÛ¾¦ÔÚ(-5, 0, 5)£¬¶¢×Å(0, 0, 0)µã£¬ÉíÌå³‾ÏòÕýÉϗ½ÓëyÖáƽÐÐ
gluLookAt(-5, 0, 5, 0, 0, 0, 0, 1, 0);
}
һЩÐĵãº
1.¡¡ÊÔ×ŵ÷ÕûÒ»ÏÂgluLookAtµÄ²ÎÊý£¬¿´¿´½á¹ûÊǗñÓëÄãÏëÏñÖеÄÒ»Ö¡£
2.¡¡¿ÉÒÔÔÚdisplayÖаÑx,y,zÖọ³öÀ´£¬ÒÔ¸¨ÖúÀí½â
3.¡¡¿´²»µ½Í¼Ïñ£¬ÓпÉÄÜÊDz»ÔÚÊÓÏߗ¶Î§ÄÚ£¬Ò²ÓпÉÄÜÊÇÀëµÃÌ«½ü£¬ÉõÖÁ»¹ÓпÉÄÜÊÇÑÕÉ«Ìî´íÁË£¬ÕâЩÐ
4.¡¡±ðÈ˵Ľ̳ÌдµÃÔٺã¬Ö»ÄÜËõ¶ÌÄãѧϰµÄ¹ý³Ì£¬µ«ÓÀÔ¶Ò²²»ÄÜÌæ´ú×Ô¼º¶‾ÊÖÕâÒ»»—½Ú¡£
À§ÄѽÓõà¶øÖÁ£¬²»ÂÛÊÇÏëÉîÈëÑо¿»¹ÊÇ¿ìËÙÁ˽âȫò£¬¶ÔÓÚÎÒÀ´Ëµ£¬¿´À´²»ÊǼþÈÝÒ×µÄÊ¡£¼ÌͶӰ֮ºó£
λͼһ½Ú£¬Í¬ÑùÒ²ÊDZ»ÆäAPIµÄÉ趨¸ãÔÎÁË£¬ËƺõOpenGLÖÐÏÔ´æÊǗâ±ÕµÄ£¬Ö»ÄÜÓýӿÚÈ¥—ÃÎÊ£¬¶øÎޗ¨Ê¹
ΪÁ˸ãÇå³þOpenGL¹ØÓÚλͼAPIµÄʹÓ㬳¢ÊÔ´Ó±¾µØÔØÈëÒ»—ùBMPͼƬÀ´ÏÔʾ¡£OpenGLרעÓÚͼÐÎäÖȾ£¬Ï
static void init()
{
FIBITMAP *dib;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glClearColor(0, 0, 0, 0);
FreeImage_Initialise(0);
dib = FreeImage_Load(FIF_BMP, "e:\\1.bmp", 0);
bits = FreeImage_GetBits(dib);
bmpw = FreeImage_GetWidth(dib);
bmph = FreeImage_GetHeight(dib);
}
static void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 1, 0);
glRasterPos2d(0, 0);
glDrawPixels(bmpw, bmph, GL_RGB, GL_UNSIGNED_BYTE, bits);
glFlush();
}
static void reshape(int width, int height)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (0, (GLfloat)width, 0, (GLfloat)height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
OK, ¿ÉÒÔÏÔʾÁË£¬µ«ÊÇÑÕÉ«²»Ì«Õý³££¬¹À¼Æ¾ÍÊÇRGBºÍBGR¸ã—´ÁË¡£¸Ä³ÉGL_BGRÊÔÊÔ£¬½á¹û¾ÓÈ»±àÒë²»¹ý£
ÔÚÉÏ´ÎÏëÍùglDrawPixelÖд«ÈëGL_BGRʧ°ÜÖ®ºó£¬¾ÍÏëÕÒ¸ö»ú»á°ÑMesa»—¾³´îÆðÀ´£¬ÒÔ±ãºóÐøѧϰ¡£Mesa
°´ÕÕreadmeÒ»²½Ò»²½ºÜÈÝÒ׾ͿÉÒÔ±àÒë³öwindows°æ±¾µÄmesa¡£°Ñ֮ǰ±àÒë²»¹ýµÄ³ÌÐòºÍmesaÒ»Æð±àÒëÁ´
ÕâÒ»À´ËµÃ÷Ò»¸öÎÊÌâ¡£windowsÌṩµÄ͗ÎļþÊÇOpenGL 1.1µÄ£¬µ«¸÷ÏÔ¿¨Çý¶‾³§ÉÌÈ´ÌṩÁ˸ßÓÚÕâ¸ö°æ±¾
µ«GL_BGRÊǸöÌØÀý£¬Ê¹ÓÃÆä½Ó¿ÚglDrawPixelÊÇ1.1±ê×¼Ö®Äڵģ¬Ö»ÊÇÕâ¸öºêûÓж¨Òå°ÕÁË£¬ÓÃMesaµÄ͗Î
Áí£¬¹ØÓÚWindowsϵÄOpenGLÇý¶‾Ä£ÐÍ£¬ÀúʗÉÏÓÐMCD(Windows NTÔøʹÓÃ)ºÍICDÁ½ÖÖ¡£Windows XPºÍVist
ºÜ¶àʱºò£¬ÖªÊ¶ÄÑÒÔ³£ÎÕÊÇÒòΪÎÒÃÇÖ»ÖªÆä±í²»ÖªÆäÀ»òÕß˵²»Á˽âÀúʗ¾Í²»ÄÜÀí½âÏÖÔÚ¡£ËùÒÔÔÚѧÏ
ÿÌìÔÚ²»¶ÏѧϰеÄÄÚÈÝʱ£¬ÎÒ¶¼»áÑ¡ÔñÖØд²âÊÔ´úÂ룬¶ø²»ÊÇÔÚ֮ǰµÄ´úÂëÉÏÐ޸ģ¬ÔÒòÊÇÏëÕÒ³öÒ»Ð
static void reshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
gluPerspective(45, 1, 0.1, 1000);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
static void init()
{
¡¡¡¡glLoadIdentity();
...
}
static void display()
{
glPushMatrix();
...
glPopMatrix();
}
ԍÒÔΪÕû¸öOpenGLÖÐÖ»ÓÐÒ»¸ö¾ØÕó¶ÑÕ»£¬Í¶Ó°±ä»»Ö®ºóÒª»Ö¸´¾ØÕ󣬽á¹ûʲôҲÏÔʾ²»³öÀ´¡£ÒÔΪÊÇÒ»¿
¶øʵ¼ÊÉÏOpenGLÖÐÓжà¸ö¾ØÕó¶ÑÕ»£¬Ä£ÐÍÊÓµã±ä»»£¬Í¶Ó°±ä»»£¬ÎÆÀí¾ùÓÐ×Ô¼ºµÄ¾ØÕó¶ÑÕ»£¬ÇÒÿ¸ö¶ÑÕ»µ
½ñÌìÓöµ½µÄÁíÒ»¸öÎÊÌâÊÇÎÆÀí³ß´ç±ØÐëΪ2´ÎÃÝ¡£ÔÚMesaÅܵúúõijÌÐò¾ÓÈ»ÔڗÇMesa»—¾³Ìùͼʧ°Ü£¬ºó
ÒÔÉÏÁ½¸öÎÊÌⶼÊÇÓÉÓÚÏëÅ׿ªÊé±¾×Ô¼ºÐ´Á½¸ö³ÌÐòÒÔ¼ì²âÊǗñÕæµÄÀí½âÁË֮ǰѧµÄ֪ʶ£¬½á¹ûдÁ½¸ö³ÌÐ
¼òµ¥ÎÆÀíʹÓÃÌ×—£¬×î¼òµ¥³£Óõij¡¾°£¬Ê¹ÓÃ2άÎÆÀí¶Ô3DÄ£ÐͽøÐÐÌùͼ¡£

1¡¢ÆôÓÃÎÆÀí¹¦ÄÜ£¬glEnable(GL_TEXTURE_2D)¡£
2¡¢´´½¨ÎÆÀí¶ÔÏó£¬glGenTexture(1, &texture)¡£
3¡¢½«ÎÆÀí¶ÔÏóÉèÖÃΪOpenGLµ±Ç°ÎÆÀí¶ÔÏó£¬ÒÔ¹©OpenGLäÖȾ£¬glBindTexture(GL_TEXTURE_2D, texture
4¡¢ÎªÎÆÀí¶ÔÏóÖ¸¶¨Î»Í¼£¬glTexImage2D¡£
5¡¢½«ÎÆÀíÓ붥µã°ó¶¨£¬Ò²¾ÍÊǗֱðÉèÖÃÎÆÀí×ø±êºÍ¶¥µã×ø±ê¡£glTexCoord2f(...); glVetex3f(...);
void init()
{
glGenTextures(1, s_texture);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, s_texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//load bitmap to s_bits
...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, s_bits_w, s_bits_h, 0, GL_RGB,
GL_UNSIGNED_BYTE, s_bits);
}
void display(void)
{
...
glBegin(GL_QUADS);
glColor3f(1, 1, 1);
glTexCoord2f(0, 1); glVertex3f(0, 1, 0);
glTexCoord2f(1, 1); glVertex3f(1, 1, 0);
glTexCoord2f(1, 0); glVertex3f(1, 0, 0);
glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
glEnd();
...
}
À©Õ¹Ò»Ï£¬Ê¹Óöà¸öÎÆÀí£¬—Ö±ðÌùµ½²»Í¬µÄ¶à±ßÐÎÉÏ£¬
1¡¢µÚÒ»²½²»±ä
2¡¢´´½¨n¸öÎÆÀí¶ÔÏó£¬glGenTexture(n, texture_array)¡£
3¡¢Ñ»—֮ǰµÄ3, 4²½£¬ÉèÖÃOpenGLµ±Ç°ÎÆÀí£¬Ö¸¶¨ÎÆÀíλͼ¡£
4¡¢ÉèÖÃOpenGLµ±Ç°ÎÆÀí£¬ÉèÖÃÎÆÀí×ø±êºÍ¶¥µã×ø±ê£¬Ñ»—¸Ã²½Öè¡£
Ò»¸ö¶à±ßÐζÔÓ¦¶à¸ö²»Í¬³ß´çµÄÎÆÀí¾ÍÊÇMipMap¡£Ò»¸ö¶à±ßÐζÔÓ¦Ò»¸öÎÆÀí£¬¾Í´æÔÚËõ—ŵÄÎÊÌ⣬Ëõ—ÅÓ
ÖÖË㗨£¬ÏßÐÔ²åÖµºÍ½üÁÚ²ÉÑù¡£MipMapÒªÇó¸÷²ã´ÎÎÆÀí¿í¸ß¾ùÊÇ2µÄÃÝ£¬ËùÒÔ¼´Ê¹Ê¹ÓÃMipMapÒ²»á´æÔÚËõ
ÊÊÓ¦¶à±ßÐγߴçµÄÎÊÌ⣬¿ÉÒÔÊÇÕë¶ÔMipMapÖеÄijһÕÅͼ½øÐÐËõ—ÅÖ®Í⣬»¹¿ÉÒÔÊǶÔÁ½ÕÅͼ½øÐÐ×ÛºÏÈ»º
—Å£¬×ۺϺóÔÙËõ—ÅÒ²ÓÐÏßÐԺͽüÁÚÁ½Ö֗½Ê½£¬´ËʱµÄÏßÐÔ²åֵϰ¹ß±»³ÆΪÈýÏßÐÔ¹ýÂË£¬¶ø֮ǰ¶ÔÓÚµ¥ÕÅÍ
ÏßÐÔ²åÖµ³ÆΪ˫ÏßÐÔ¹ýÂË¡£
Áí£¬²åÖµ£¬¹ýÂË£¬Â˲¨Í¨³£ÊÇÒ»¸öÒâ˼¡£
Ôç¾ÍÏë³¢ÊÔÒ»ÏÂÔÚMacÉÏ¿ª—¢OpenGL³ÌÐò£¬ÔÒòºÜ¼òµ¥£¬´«ÎÅMac OS X¶ÔOpenGLÖ§³ÖµÃºÜºÃ£¬µ±È»Ò²ÊǗÀ

AppleΪ¿ª—¢ÕßÌṩÁËxCode£¬ÀàËÆÓÚVisual StudioÒ»ÑùµÄ¶«¶«¡£ÒªÏëÔÚMacÏ¿ª—¢OpenGL³ÌÐòÆäʵ¾ÍÊÇÈ

ʹÓÃxCode¿ª—¢OpenGL³ÌÐòµÄ²½ÖèÈçÏ£¬

1. Æô¶‾xCode¡£Èç¹ûûÓоÍÈ¥Apple¹ÙÍøÏÂÒ»¸ö¡£Ñ¡ÔñCreate your fiirst Cocoa Application...

2. À´µ½ÁËXcode Project Management Guide½çÃ棬ʹÓÃcommand+shift+N¿ì½Ý¼üн¨¹¤³Ì...

3. Ñ¡ÔñApplication->Cocoa Application£¬Ö®ºóÊäÈ빤³ÌÃû

4. Cocoa ApplicationĬÈÏÊÇʹÓÃobjective-CÀ´±à³ÌµÄ£¬ÕâÒ²ÊÇMacϵͳÍƼöµÄÓïÑÔ£¬²»¹ýÎÒÃÇÐèҪʹÓ

5. ¼ÓÈëOpenGLºÍglutµÄframework¡£frameworkÒ»°ã°²×°ÔÚ×ÊÔ´¿âĿ¼Ï¡£
6. н¨Ò»¸ö.cÎļþ£¬ÔÚÆäÖмÓÈëOpenGL´úÂë¡£

7. µã»÷Build And Go¡£

OK¡£ÊDz»ÊÇ¿´µ½½á¹ûÁË¡£ºÇºÇ¡£
ÔÚOpenGLÖÐҪʹÓùâÕ՗ÖΪËĸö²½Ö裬
1¡¢ÆôÓùâÕÕ
2¡¢ÆôÓùâÔ´£¬¹âÔ´ÊýÁ¿ÊÜÓ²¼þÏÞÖÆ
3¡¢ÉèÖùâÔ´ÊôÐÔ
4¡¢ÉèÖÃÎïÌå²ÄÖÊÊôÐÔ
¿É¼û¹âÕÕÏà¹ØµÄÊôÐԱȽ϶࣬ҪÏëÀí½â¸÷ÖÖ¹âÕÕЧ¹û£¬
Á˽âÆäÄÚ²¿Êýѧ¼ÆË㹫ʽÊDZØÒªµÄ£¬ÔÚ´ËÖ®Éϸ¨Ö®Ò»Ð©Êµ¼ÊÀý×Ó£¬ÒÔÓиüÖ±¹ÛЧ¹û£¬¼ÓÉîÀí½â¡£
´ÓäÖȾÊä³öµÄ½Ç¶ÈÀ´Ëµ£¬¹âÕյĸ÷ÖÖÊôÐÔÓ°ÏìµÄÊÇ×îºóÏñËØÊä³öµÄÑÕÉ«£¬¼´ÏñËØÊä³öÑÕÉ«ÓɹâÕ՗½³Ì¾ö¶
¿´ÕâЩÊýѧ¹«Ê½Ê±µÄһЩ¸Ð´¥£º
1¡¢´Ó¹«Ê½ÉÏ¿´ÏñËØÑÕÉ«ÓÉÈý²¿—Ö¾ö¶¨£¬Èý²¿—ÖÖ®¼äÊǼӹØϵ£¬ÄÚ²¿Êdz˗¨¹Øϵ¡£
a.¶¥µãµÄ—¢Éä¹âÑÕÉ«(glMaterialfv(GL_EMISSION, ...))
b.È«¾Ö»—¾³¹â(glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ...)×÷ÓÃÓÚ¶¥µã(glMaterialfv(GL_A
c.¸÷¹âÔ´(glLightfv(xxx, ...)×÷ÓÃÓÚ¶¥µã(glMaterialfv(xxx, ...))µÄЧ¹û
2¡¢Òª×¢Òâͨ¹ýOpenGL APIÅäÖõĹâÕÕÊôÐÔÊÇÏòÁ¿»¹Êǵ㡣ÎÒ×Ô¼ºÔڗÖÎö¾Û¹âЧ¹ûʱ£¬Ò»Ö±°ÑGL_SPOT_DI
3¡¢¹«Ê½¼ÆËã½á¹û±»½ØÈ¡µ½£Û0, 1£ÝÇø¼ä¡£
4¡¢ÏòÁ¿µã³Ë½á¹ûΪ±êÁ¿£¬±íʾÁ½ÏòÁ¿Ôڗ½ÏòÉϵIJîÒì³Ì¶È£»ÏòÁ¿²æ³Ë½á¹ûΪÏòÁ¿£¬ÓÃÓÚÇó—¨Ïß¡£

ÏÖʵÖеĹâÕÕÔ¶±È´Ë¸´ÔÓ£¬OpenGLÔÚЧ¹ûÓëÐÔÄÜÉÏ×öÁËÕÛÖУ¬µ«¼´±ãÈç´Ë³¡¾°ÖеĹâÔ´ÊýÁ¿¶ÔÐÔÄÜÈÔÓн
Ç°ÃæµÄËæ±ÊÖÐÔø¾ÓйýÒ»¸öÒÉÎÊ¡ª¡ªÔÚWindowsÏÂÈçºÎʹÓøü¸ß°æ±¾µÄOpenGL API¡£Õâ¸öÒÉÎÊÔÚÇ°¼¸ÌìÖÕ
PROC wglGetProcAddress(
LPCSTR lpszProc // name of the extension function
);
—µ»ØÖµÊǺ‾ÊýÈë¿ÚµØ֗£¬ÊäÈë²ÎÊýlpszProc¼´ÊÇOpenGL±ê×¼»òÀ©Õ¹APIµÄÃû×Ö£¬´óСд±ØÐëÍêÈ«Ïàͬ¡£Èç
wglGetProcAddress("glWindowPos2d");
Èç¹û—µ»ØNULLÔò±íʾ¸ÃAPIÔÚµ±Ç°»—¾³Ï²»±»Ö§³Ö¡£
glewÊÇÒ»¸ö¿çƽ̨(Linux/Mac OS/Windows)µÄʹÓÃOpenGLÀ©Õ¹µÄº‾Êý¿â£¬»ùÓÚËü¿ª—¢Õß¿ÉÒÔÖ±½ÓʹÓÃOpe
¹ØÓÚOpenGL ICD£¬Î¢Èí»òÕßSGI¶¼Ã»Óй«¿ªÈκÎÄÚ²¿ÐÅÏ¢£¬Ä¿Ç°¿ÉÒÔÁ˽⵽µÄ½öÊÇÈçϼ¸µã£º
1¡¢ÓÉÓ²¼þ³§ÉÌÌṩ£¬²¢ÔÚ×¢²á±íÖÐ×¢²áһЩÐÅÏ¢£¬Î»ÖÃÊÇHKLM/System/CurrentControlSet/Control/Cl
2¡¢ICDÓ¦¸ÃÓÐһЩ³éÏó½Ó¿Ú£¬Õâ¸öͨ¹ý—ÖÎöopengl32.dll¼°¸÷³§ÉÌËùÌṩµÄÇý¶‾dll¿ÉÒÔÖªµÀ¡£ÈçDrvCop
ÒÔÏÂÊÇһЩ²Î¿¼ÐÅÏ¢£º
1. Advanced_Graphics_Programming_Techniques_Using_OpenGL£¬ÔÚÀú½ìSIGGRAPH(97-2000)ÉϵÄÒ»Ì׿Î
2. Mark J. Kilgard, All About OpenGL Extensions, (http://www.opengl.org/resource
s/features/OGLextensions/)£¬ÄÚÈݺÍÉÏһƪÓÐЩÏàËÆ
3. MSDN, Initializing Display Miniport and User-Mode Display Drivers, http://msd
n.microsoft.com/en-us/library/ms797580.aspx

You might also like