- 博客(0)
- 资源 (5)
- 收藏
- 关注
OpenGL库函数帮助文档,没有中文的
OpenGL库函数帮助文档,附带的实例不错
#include <gl/glu.h>
#include <GL/gl.h>
#include <GL/glaux.h>
//第一行设置的变量是Rendering Context(着色描述表)。每一个OpenGL都被连接到一个着色描述表上。
//着色描述表将所有的OpenGL调用命令连接到Device Context(设备描述表)上。
//DC将窗口连接到GDI(Graphics Device Interface图形设备接口)。而RC将OpenGL连接到DC。
//创建OpenGL窗口的通常步骤
// 1.创建一个扩展的Windows窗口(注册类,创建窗口,取得句柄hwnd,取得设备场景hdc
// 2.提供一个像素格式(结构),让Windows寻找匹配的格式,并给场景设置对应的像素格式
// 3.取得场景的着色描述表hrc,并激活着色描述表
// 4.显示窗口,调用调整窗口尺寸过程,调用GL初始化过程
// 5.进入窗口的消息循环,调用绘制过程,调用交换缓存过程显示图形
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
HGLRC hRC=NULL; // 永久着色描述表
HDC hDC=NULL; // 私有GDI设备描述表
HWND hWnd=NULL; // 保存我们的窗口句柄
HINSTANCE hInstance; // 保存程序的实例
bool keys[256]; // 用于键盘例程的数组
bool active=TRUE; // 窗口的活动标志,缺省为TRUE
bool fullscreen=TRUE; // 全屏标志缺省设定成全屏模式
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置并初始化GL窗口大小
{
if (height==0) // 防止被零除
{
height=1; // 将Height设为1
}
glViewport(0, 0, width, height); // 重置当前的视口(Viewport)
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
// 计算窗口的外观比例
gluPerspective(50.0f,(GLfloat)width /(GLfloat) height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
}
int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置
{
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;
}
// 在DrawGLScene中进行所有的绘制
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
// 调用glLoadIdentity()之后,您实际上讲当前点移到了屏幕中心,
// X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
// OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
// 中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。
// 移入屏幕深处是负值,移出屏幕则是正值,下面的代码绘制一个三角形和正方形
glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 单位,并移入屏幕 6.0
glBegin(GL_TRIANGLES); // 绘制三角形
glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点
glVertex3f(-1.0f,-1.0f, 0.0f); // 左下
glVertex3f( 1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 三角形绘制结束
glTranslatef(3.0f,0.0f,0.0f); // 右移3单位
glBegin(GL_QUADS); // 绘制正方形
glVertex3f(-1.0f, 1.0f, 0.0f); // 左上
glVertex3f( 1.0f, 1.0f, 0.0f); // 右上
glVertex3f( 1.0f,-1.0f, 0.0f); // 左下
glVertex3f(-1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 正方形绘制结束
return TRUE; // 一切 OK
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
MSG msg;
GLuint PixelFormat; // 保存查找匹配的象素格式
WNDCLASS wc; // 窗口类结构
DWORD dwExStyle; // 扩展窗口风格
DWORD dwStyle; // 窗口风格
hInstance = GetModuleHandle(NULL); // 取得我们窗口的实例
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 移动时重画,并为窗口取得DC
wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc处理消息
wc.cbClsExtra = 0; // 无额外窗口数据
wc.cbWndExtra = 0; // 无额外窗口数据
wc.hInstance = hInstance; // 设置实例
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // 装入缺省图标
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 装入鼠标指针
wc.hbrBackground = NULL; // GL不需要背景
wc.lpszMenuName = NULL; // 不需要菜单
wc.lpszClassName = "OpenGL"; // 设定类名字
if (!RegisterClass(&wc)) // 尝试注册窗口类
{
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; //退出并返回FALSE
}
//注意我们在窗体风格中包括了 WS_CLIPSIBLINGS 和 WS_CLIPCHILDREN。
//要让OpenGL正常运行,这两个属性是必须的。他们阻止别的窗体在我们的窗体上绘图。
hWnd=CreateWindowEx( WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, // 扩展窗体风格
"OpenGL", // 类名字
"OpenGL", // 窗口标题
WS_CLIPSIBLINGS | // 必须的窗体风格属性
WS_CLIPCHILDREN | // 必须的窗体风格属性
WS_OVERLAPPEDWINDOW, // 选择的窗体属性
0, 0, // 窗口位置
600, // 计算调整好的窗口宽度
400, // 计算调整好的窗口高度
NULL, // 无父窗口
NULL, // 无菜单
hInstance, // 实例
NULL);
//下面的代码描述象素格式。我们选择了通过RGBA(红、绿、蓝、alpha通道)
//支持OpenGL和双缓存的格式。我们试图找到匹配我们选定的色彩深度(16位、24位、32位)的象素格式。
//最后设置16位Z-缓存。其余的参数要么未使用要么不重要
//(stencil buffer模板缓存和accumulation buffer聚集缓存除外)。
//PIXELFORMATDESCRIPTOR结构与ChoosePixelFormat()与SetPixelFormat()的定义见WinGDI.h文件
//wglCreateContext()与wglMakeCurrent()的定义均见WinGDI.h文件
static PIXELFORMATDESCRIPTOR pfd= //pfd 告诉窗口我们所希望的东东
{
sizeof(PIXELFORMATDESCRIPTOR), //上诉格式描述符的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 格式必须支持窗口
PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL
PFD_DOUBLEBUFFER, // 必须支持双缓冲
PFD_TYPE_RGBA, // 申请 RGBA 格式
16, // 选定色彩深度
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 无Alpha缓存
0, // 忽略Shift Bit
0, // 无聚集缓存
0, 0, 0, 0, // 忽略聚集位
16, // 16位 Z-缓存 (深度缓存)
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘图层
0, // 保留
0, 0, 0 // 忽略层遮罩
};
hDC=GetDC(hWnd); //取得GL窗口的设备描述表达
PixelFormat=ChoosePixelFormat(hDC,&pfd); //让WINDOWS寻找与我们提供的pfd相匹配的像素格式,找到后保存在变量PixelFormat中
SetPixelFormat(hDC,PixelFormat,&pfd); //给设备场景hDC设置象素格式
hRC=wglCreateContext(hDC); //取得着色描述表
wglMakeCurrent(hDC,hRC); //激活着色描述表,GL窗口创建工作完成
ShowWindow(hWnd,SW_SHOW); // 显示窗口
SetForegroundWindow(hWnd); // 略略提高优先级
SetFocus(hWnd); // 设置键盘的焦点至此窗口
ReSizeGLScene(600, 400); //调整GL窗口尺寸
InitGL(); //GL初始设置
//GetMessage从调用线程的消息队列里取得一个消息并将其放于指定的结构,
//GetMessage不是实时的,需要实时的用While(!done)或结合Timer
//我们绘制场景并交换缓存(使用双缓存可以实现无闪烁的动画)。
//我们实际上在另一个看不见的"屏幕"上绘图。当我们交换缓存后,
//我们当前的屏幕被隐藏,现在看到的是刚才看不到的屏幕。
//这也是我们看不到场景绘制过程的原因。场景只是即时显示。
while (GetMessage (&msg, NULL, 0, 0)) //进入消息循环并从消息队列中取得消息。
{
DrawGLScene(); // 绘制场景
SwapBuffers(hDC); // 交换缓存
TranslateMessage (&msg) ; //TranslateMessage 转译某些键盘消息。
DispatchMessage (&msg) ; //DispatchMessage 将消息发送给窗口消息处理程序。
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
CreateWindow (TEXT ("button"), TEXT ("按钮"),
WS_CHILD | WS_VISIBLE ,
0, 0, 50, 50,
hwnd, NULL, hInstance, NULL) ;
return false;
case WM_DESTROY:
PostQuitMessage (0) ; //PostQuitMessage 在消息队列中插入一个「退出程序」消息。
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ; //DefWindowProc 执行内定的消息处理。
}
2014-06-28
OpenGL SDk库文件包含.dll .h .lib文件
OpenGL SDk库文件包含.dll .h .lib
1.将开发库中的.h文件拷贝到Visual C++ 6.0的\Include\GL目录中
2.将.lib文件拷贝到Visual C++ 6.0的\lib目录中
3.将.dll文件拷贝到操作系统的system32目录中
2014-06-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人