一个OpenGL框架

// openGLPro.cpp : Defines the entry point for the application.
//http://www.gamedev.net/page/resources/_/technical/opengl/opengl-tutors-r839

// openGLPro.cpp : Defines the entry point for the application.
//


#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>


#include<gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>


HDC hDC=NULL;
HGLRC hRC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance;


bool keys[256];
bool active=TRUE;
bool fullscreen=TRUE;


GLfloat rtri;
GLfloat rquad;
GLfloat xrot;
GLfloat yrot;
GLfloat zrot;


GLuint texture[1];


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);


AUX_RGBImageRec *LoadBMP(char *Filename)
{
FILE *File=NULL;
if (!Filename)
{
return NULL;
}


File=fopen(Filename,"r");
if (File)
{
fclose(File);
return auxDIBImageLoad(Filename);
}


return NULL;
}


int LoadGLTextures()
{
int Status=FALSE;
AUX_RGBImageRec *TextureImage[1];


memset(TextureImage,0,sizeof(void *)*1);
if (TextureImage[0]=LoadBMP("data/NeHe.bmp"))
{
Status=TRUE;
glGenTextures(1,&texture[0]);
glBindTexture(GL_TEXTURE_2D,texture[0]);
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,
TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,
TextureImage[0]->data);


glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);


}


if (TextureImage[0])
{
if (TextureImage[0]->data)
{
free(TextureImage[0]->data);
}
free(TextureImage[0]);
}


return Status;
}


GLvoid ReSizeGLScene(GLsizei width,GLsizei height)
{
if (height==0)
{
height=1;
}
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);


glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}


int InitGL(GLvoid)
{
if (!LoadGLTextures())
{
return FALSE;
}
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);




glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
return TRUE;
}


int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();


glTranslatef(-1.5f,0.0f,-6.0f);
glRotatef(rtri,1.0f,1.0f,0.0f);
glBegin(GL_TRIANGLES);
/* glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,0.0f);*/
glColor3f(1.0f,0.0f,0.0f);          // Red
glVertex3f( 0.0f, 1.0f, 0.0f);          // Top Of Triangle (Front)
glColor3f(0.0f,1.0f,0.0f);          // Green
glVertex3f(-1.0f,-1.0f, 1.0f);          // Left Of Triangle (Front)
glColor3f(0.0f,0.0f,1.0f);          // Blue
glVertex3f( 1.0f,-1.0f, 1.0f);          // Right Of Triangle (Front)


glColor3f(1.0f,0.0f,0.0f);          // Red
glVertex3f( 0.0f, 1.0f, 0.0f);          // Top Of Triangle (Right)
glColor3f(0.0f,0.0f,1.0f);          // Blue
glVertex3f( 1.0f,-1.0f, 1.0f);          // Left Of Triangle (Right)
glColor3f(0.0f,1.0f,0.0f);          // Green
glVertex3f( 1.0f,-1.0f, -1.0f);         // Right Of Triangle (Right)


glColor3f(1.0f,0.0f,0.0f);          // Red
glVertex3f( 0.0f, 1.0f, 0.0f);          // Top Of Triangle (Back)
glColor3f(0.0f,1.0f,0.0f);          // Green
glVertex3f( 1.0f,-1.0f, -1.0f);         // Left Of Triangle (Back)
glColor3f(0.0f,0.0f,1.0f);          // Blue
glVertex3f(-1.0f,-1.0f, -1.0f);         // Right Of Triangle (Back)


glColor3f(1.0f,0.0f,0.0f);          // Red
glVertex3f( 0.0f, 1.0f, 0.0f);          // Top Of Triangle (Left)
glColor3f(0.0f,0.0f,1.0f);          // Blue
glVertex3f(-1.0f,-1.0f,-1.0f);          // Left Of Triangle (Left)
glColor3f(0.0f,1.0f,0.0f);          // Green
glVertex3f(-1.0f,-1.0f, 1.0f);          // Right Of Triangle (Left)

glEnd();
glLoadIdentity();


glTranslatef(1.5f,0.0f,-7.0f);//平移
glColor3f(0.5f,0.5f,1.0f);//颜色
glRotatef(rquad,0.0f,1.0f,1.0f);
glBegin(GL_QUADS);
/* glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,0.0f);*/


glColor3f(0.0f,1.0f,0.0f);          // Set The Color To Green
glVertex3f( 1.0f, 1.0f,-1.0f);          // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f,-1.0f);          // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f);          // Bottom Left Of The Quad (Top)
glVertex3f( 1.0f, 1.0f, 1.0f);          // Bottom Right Of The Quad (Top)


glColor3f(1.0f,0.5f,0.0f);          // Set The Color To Orange
glVertex3f( 1.0f,-1.0f, 1.0f);          // Top Right Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f, 1.0f);          // Top Left Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f,-1.0f);          // Bottom Left Of The Quad (Bottom)
glVertex3f( 1.0f,-1.0f,-1.0f);          // Bottom Right Of The Quad (Bottom)


glColor3f(1.0f,0.0f,0.0f);          // Set The Color To Red
glVertex3f( 1.0f, 1.0f, 1.0f);          // Top Right Of The Quad (Front)
glVertex3f(-1.0f, 1.0f, 1.0f);          // Top Left Of The Quad (Front)
glVertex3f(-1.0f,-1.0f, 1.0f);          // Bottom Left Of The Quad (Front)
glVertex3f( 1.0f,-1.0f, 1.0f);          // Bottom Right Of The Quad (Front)


glColor3f(1.0f,1.0f,0.0f);          // Set The Color To Yellow
glVertex3f( 1.0f,-1.0f,-1.0f);          // Bottom Left Of The Quad (Back)
glVertex3f(-1.0f,-1.0f,-1.0f);          // Bottom Right Of The Quad (Back)
glVertex3f(-1.0f, 1.0f,-1.0f);          // Top Right Of The Quad (Back)
glVertex3f( 1.0f, 1.0f,-1.0f);          // Top Left Of The Quad (Back)


glColor3f(0.0f,0.0f,1.0f);          // Set The Color To Blue
glVertex3f(-1.0f, 1.0f, 1.0f);          // Top Right Of The Quad (Left)
glVertex3f(-1.0f, 1.0f,-1.0f);          // Top Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f,-1.0f);          // Bottom Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f, 1.0f);          // Bottom Right Of The Quad (Left)


glColor3f(1.0f,0.0f,1.0f);          // Set The Color To Violet
        glVertex3f( 1.0f, 1.0f,-1.0f);          // Top Right Of The Quad (Right)
        glVertex3f( 1.0f, 1.0f, 1.0f);          // Top Left Of The Quad (Right)
        glVertex3f( 1.0f,-1.0f, 1.0f);          // Bottom Left Of The Quad (Right)
        glVertex3f( 1.0f,-1.0f,-1.0f);          // Bottom Right Of The Quad (Right)




glEnd();
rtri+=0.2f;
rquad+=0.15f;
return TRUE;
}


GLvoid KillGLWindow(GLvoid)
{
if (fullscreen)
{
ChangeDisplaySettings(NULL,0);
ShowCursor(TRUE);
}
if (hRC)
{
if (!wglMakeCurrent(NULL,NULL))
{
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",
MB_OK | MB_ICONINFORMATION);
}
hRC=NULL;
}
if(hDC && !ReleaseDC(hWnd,hDC))
{
MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",
MB_OK | MB_ICONINFORMATION);
hWnd=NULL;
}
if(!UnregisterClass("OpenGL",hInstance))
{
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
        hInstance=NULL;                         // Set hInstance To NULL


}
}


BOOL CreateGLWindow(char *title,int width,int height,
int bits,bool fullscreenflags)
{
GLuint PixelFormat;
WNDCLASS wc;
DWORD dwExStyle;
DWORD dwStyle;


RECT windowRect;
windowRect.left=(long)0;
windowRect.right=(long)width;
windowRect.top=(long)0;
windowRect.bottom=(long)height;
fullscreen=fullscreenflags;




hInstance       = GetModuleHandle(NULL);            // Grab An Instance For Our Window
wc.style        = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;       // Redraw On Move, And Own DC For Window
wc.lpfnWndProc      = (WNDPROC) WndProc;                // WndProc Handles Messages
wc.cbClsExtra       = 0;                        // No Extra Window Data
wc.cbWndExtra       = 0;                        // No Extra Window Data
wc.hInstance        = hInstance;                    // Set The Instance
wc.hIcon        = LoadIcon(NULL, IDI_WINLOGO);          // Load The Default Icon
wc.hCursor      = LoadCursor(NULL, IDC_ARROW);          // Load The Arrow Pointer
wc.hbrBackground    = NULL;                     // No Background Required For GL
wc.lpszMenuName     = NULL;                     // We Don't Want A Menu
wc.lpszClassName    = "OpenGL";                 // Set The Class Name


if(!RegisterClass(&wc))
{
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;   

}


if (fullscreen)
{
DEVMODE dmScreenSettings;
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth=width;
dmScreenSettings.dmPelsHeight=height;
dmScreenSettings.dmBitsPerPel=bits;
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSHEIGHT;


if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
fullscreen=FALSE;               // Select Windowed Mode (Fullscreen=FALSE)
}
else
{
// Pop Up A Message Box Letting User Know The Program Is Closing.
MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
return FALSE;                   // Exit And Return FALSE
}
}


}


if (fullscreen) // Are We Still In Fullscreen Mode?
{
dwExStyle=WS_EX_APPWINDOW; // Window Extended Style
dwStyle=WS_POPUP; // Windows Style
ShowCursor(FALSE); // Hide Mouse Pointer
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style
dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style
}


AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size


// Create The Window
if (!(hWnd=CreateWindowEx( dwExStyle, // Extended Style For The Window
"OpenGL", // Class Name
title, // Window Title
dwStyle | // Defined Window Style
WS_CLIPSIBLINGS | // Required Window Style
WS_CLIPCHILDREN, // Required Window Style
0, 0, // Window Position
windowRect.right-windowRect.left, // Calculate Window Width
windowRect.bottom-windowRect.top, // Calculate Window Height
NULL, // No Parent Window
NULL, // No Menu
hInstance, // Instance
NULL))) // Dont Pass Anything To WM_CREATE
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}


static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
bits, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)  
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
0, 0, 0 // Layer Masks Ignored
};

if (!(hDC=GetDC(hWnd))) // Did We Get A Device Context?
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}


if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}


if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format?
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}


if (!(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context?
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}


if(!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}


ShowWindow(hWnd,SW_SHOW); // Show The Window
SetForegroundWindow(hWnd); // Slightly Higher Priority
SetFocus(hWnd); // Sets Keyboard Focus To The Window
ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen


if (!InitGL()) // Initialize Our Newly Created GL Window
{
KillGLWindow(); // Reset The Display
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}


return TRUE; // Success

}


LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,
WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_ACTIVATE:
if (!HIWORD(wParam))
{
active=TRUE;
}
else
{
active=FALSE;
}
return 0;
case WM_SYSCOMMAND:
switch (wParam)
{
case SC_SCREENSAVE:
case SC_MONITORPOWER:
return 0;
}
break;
case WM_CLOSE:
PostQuitMessage(0);
return 0;
case WM_KEYDOWN:
keys[wParam]=TRUE;
return 0;

case WM_KEYUP:
keys[wParam]=FALSE;
return 0;
case WM_SIZE:
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);


}


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.


MSG msg;
BOOL done=FALSE;


if (MessageBox(NULL,"Would you like to run in Fullscreen Mode?",
"Start Fullscreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE;
}


// Create Our OpenGL Window
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0;                           // Quit If Window Was Not Created
}


while (!done)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
done=TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
if (active)
{
if (keys[VK_ESCAPE])
{
done=TRUE;
}
else
{
DrawGLScene();
SwapBuffers(hDC);
}
}


if (keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen=!fullscreen;
if(!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0;
}
}
}
}


KillGLWindow();
return (msg.wParam);
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值