zoukankan      html  css  js  c++  java
  • OpenGL自学教程1(窗口建立)

    虚拟手术项目中需要用到OpenGL,但是方便起见选择了GLUT,省去了一大堆窗口注册的麻烦!因为是刚刚开始接触这个东西,学起来也比较慢,想在这里记录一下自己学习的过程!
    网上有个NeHe写的OpenGL教程,非常详细,当然也有人用GLUT将其实现的,这一点很佩服老外的东西,既好还给你开放出来,给我们这些菜鸟级的人物提供了许多方便!
    废话不多说,这回写的是第一个窗口,没有任务内容,只是一个带有“询问是否进行全屏显示”的对话框,然后出现一个全黑的窗口,代码如下:

    代码
    1 /*
    2 NeHe教程的第一课,生成一个游戏界面的窗口,
    3 询问是否使用全屏游戏模式:true 进入全屏
    4 false:则为窗口模式
    5  */
    6
    7  /*
    8 作者:俞超
    9 时间:2010.11.02
    10  */
    11
    12 #include <windows.h> //Windows程序标准的头文件
    13 #include <GL/glut.h> //glut头文件
    14
    15 //这条语句可以去除控制台
    16 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
    17
    18 //添加库文件
    19 #pragma comment(lib,"opengl32.lib")
    20 #pragma comment(lib,"glu32.lib")
    21 #pragma comment(lib,"glut32.lib")
    22
    23 //全局变量
    24 bool g_gamemode; //是否使用游戏的全屏模式
    25 bool g_fullscreen; //全屏模式
    26
    27 //初始化函数
    28 bool init(void)
    29 {
    30 glShadeModel(GL_SMOOTH); // 开启平滑阴影模式
    31 glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
    32 glClearDepth(1.0f); // 深度缓存
    33 glEnable(GL_DEPTH_TEST); // 开启深度缓存
    34 glDepthFunc(GL_LEQUAL); // 深度缓存测试的类型
    35 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 启动反锯齿模式
    36 return true;
    37 }
    38
    39 //绘制函数
    40 void render(void)
    41 {
    42 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕内容和深度缓存内容
    43 glLoadIdentity(); // 重置模型视觉的矩阵
    44
    45 // 交换前后缓存内容
    46 glutSwapBuffers ( );
    47 }
    48
    49 //窗口大小改变回调函数
    50 void reshape(int w,int h)
    51 {
    52 glViewport(0, 0, w, h);
    53 glMatrixMode(GL_PROJECTION); // 选择投影矩阵
    54 glLoadIdentity(); // 重置投影矩阵
    55
    56 if (h == 0) h = 1;
    57 // 计算方位角,并设置透视的 角度
    58 gluPerspective(80, (float)w/(float)h, 1.0, 5000.0);
    59 glMatrixMode(GL_MODELVIEW); // 选择模型视图矩阵
    60 glLoadIdentity(); // 重置模型视图矩阵
    61 }
    62
    63 //按钮回调函数
    64 void keyboard(unsigned char key,int x,int y)
    65 {
    66 switch (key) {
    67 case 27: // 如果按下Esc
    68 exit(0); // 退出程序
    69 break;
    70 default:
    71 break;
    72 }
    73 }
    74
    75 //特殊键回调函数
    76 void special_keys(int a_keys,int x,int y)
    77 {
    78 switch (a_keys) {
    79 case GLUT_KEY_F1:
    80 // 切换全屏模型和窗口模型,由F1按键确定
    81 if (!g_gamemode) {
    82 g_fullscreen = !g_fullscreen; // 触发全民开头
    83 if (g_fullscreen) glutFullScreen(); // We Went In Fullscreen Mode
    84 else glutReshapeWindow(500, 500); // We Went In Windowed Mode
    85 }
    86 break;
    87 default:
    88 break;
    89 }
    90 }
    91
    92 //弹出询问窗口
    93 void ask_gamemode()
    94 {
    95 int answer;
    96 // 询问是否使用全屏游戏模式
    97 answer = MessageBox(NULL, "Do you want to enter game mode?", "Question",
    98 MB_ICONQUESTION | MB_YESNO);
    99 g_gamemode = (answer == IDYES);
    100 // 如果没有选择全屏模式则进入窗口模式
    101 g_fullscreen = false;
    102 }
    103
    104 //主函数
    105 int main(int argc,char** argv)
    106 {
    107 ask_gamemode(); // 询问是否全屏模型
    108 glutInit(&argc, argv); // Glut初始化函数
    109 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); // 显示的模型,一般都为RGB|DOUBLE
    110 if (g_gamemode) {
    111 glutGameModeString("640x480:16"); // 进入 640x480 16像素的模型
    112 if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE))
    113 glutEnterGameMode(); // 进入全屏
    114 else g_gamemode = false; // 如果不能进入全屏模式,则回到窗口模式
    115 }
    116 if (!g_gamemode) {
    117 glutInitWindowSize(500, 500); // 窗口模式的大小
    118 glutCreateWindow("NeHe's OpenGL Framework"); // 窗体抬头的标题
    119 }
    120 init(); // 自定义的初始化函数
    121 glutDisplayFunc(render); // 注册显示回调函数
    122 glutReshapeFunc(reshape); // 注册窗口大小改变回调函数
    123 glutKeyboardFunc(keyboard); // 注册键盘回调函数
    124 glutSpecialFunc(special_keys); // 注册特殊键盘回调函数
    125 glutMainLoop(); // 进入Glut循环
    126 return 0;
    127 }
  • 相关阅读:
    javaweb基础(6)_servlet配置参数
    javaweb基础(5)_servlet原理
    读书笔记:java特种兵(上)
    基础算法(四):海量数据的处理方法
    基础算法(三)动态规划和贪心算法
    基础算法(二):堆排序,快速排序
    基本算法(一):插入排序,归并排序
    JVM基础和调优(六)
    JVM基础和调优(五)
    JVM基础和调优(四)
  • 原文地址:https://www.cnblogs.com/yuchao/p/1867488.html
Copyright © 2011-2022 走看看