FreeGLUT Tips: 详解 glutInit 的入口参数
来源:互联网 发布:淘宝聚划算团购怎么抢 编辑:程序博客网 时间:2024/06/07 03:54
问题
前文我们遇到的问题是,如何正确地给 glutInit() 这个函数传递一个正确的入口参数,使它能够正确地初始化OpenGL环境。
假设大家都在使用Visual C++。当我们创建一个控制台应用程序,而且不考虑Unicode的情形,那么我们的main函数自然而然地提供了 glutInit() 所需的两个参数:
int main (int argc, char* argv[]){ glutInit (&argc, argv); // ... // ... return 0;}
但是,如果我们创建的是一个考虑了Unicode情形的控制台应用程序,那么我们的main函数就变成了:
int _tmain (int argc, _TCHAR* argv[])
现在我们该如何调用 glutInit() 来初始化OpenGL环境呢?
甚至于,如果我们创建的不是一个控制台应用程序,而是一个Win32应用程序(带GUI的那种),那么我们的main函数就变成了:
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow)
这时候我们又该如何调用 glutInit() 来初始化OpenGL环境呢?
所以我们必须要了解,该如何正确地给 glutInit() 传递入口参数。
分析
我们从FreeGLUT官方网站下载源代码,然后分析其源码。只需要看 src 目录下的 fg_init.c 这个文件就可以了。
我们看来看 glutInit() 的入口参数:
/* * Perform initialization. This usually happens on the program startup * and restarting after glutMainLoop termination... */void FGAPIENTRY glutInit( int* pargc, char** argv )
看这个函数的实现。只需要看与入口参数相关的部分:
void FGAPIENTRY glutInit( int* pargc, char** argv ){ // ... if (pargc && *pargc && argv && *argv && **argv) { fgState.ProgramName = strdup (*argv); // ... } // ... fghParseCommandLineArguments ( pargc, argv, &displayName, &geometry ); // ...}
只有两处代码用到了入口参数。
fgState.ProgramName = strdup (*argv);
如果在一个控制台应用程序中,“char* argv[]”的第一个参数无非是应用程序的路径和文件名。所以当这个参数缺失时,我们“手动”给这么一个名字即可。
fghParseCommandLineArguments
看这个函数的实现:
void fghParseCommandLineArguments ( int* pargc, char** argv, char **pDisplayName, char **pGeometry )
阅读源码可知这个函数是从控制台应用程序的环境变量字符串里面提取下列参数,用来设置“char **pDisplayName”和“char **pGeometry”:
getenv( “DISPLAY” )
这个用来设置pDisplayName。
-display
如果它存在,则用它来设置pDisplayName。
getenv( “GLUT_FPS” )
它用来设置fgState.FPSInterval。
-geometry
它用来设置pGeometry 。
-direct和-indirect
它用来设置fgState.DirectContext。
-iconic
它用来设置fgState.ForceIconic。
-gldebug
它用来设置fgState.GLDebugSwitch。
-sync
它用来设置fgState.XSyncSwitch。
结论
现在应该清楚该如何正确地构建 glutInit() 的入口参数了吧。
- FreeGLUT Tips: 详解 glutInit 的入口参数
- freeglut ERROR:Function <glutMainLoopEvent> called without first calling 'glutInit'
- glutInit
- Dll入口函数参数详解...
- Dll入口函数参数详解
- Dll入口函数参数详解...
- Dll入口函数参数详解
- 使用SiftGPU遇到问题:freeglut ERROR: Function <glutDestroyWindow> called without first calling 'glutInit'.
- main 函数的入口参数
- 查看程序的启动参数,入口参数
- freeglut
- OpenGL Tips: 在Visual C++中调用FreeGLUT
- 函数入口参数加const的问题
- [收藏]C++ Tips(4)--参数的检查
- [收藏]C++ Tips(4)--参数的检查
- Cocos2d-x的应用入口详解
- 详解 php mvc的单点入口程序
- FleaPHP的单入口文件详解
- php中explode与split的区别介绍
- Nginx+Lua开发
- sublime text 的SFTP插件
- Linq to SQL --C#ORM框架 入门
- oracle使用sql语句增加字段示例(sql删除字段语句)_oracle
- FreeGLUT Tips: 详解 glutInit 的入口参数
- 关于tasklet的一点小小的解释
- 【Facebook的UI开发框架React入门之七】多View布局与样式Style简介(iOS平台)-goodmao
- php 控制台打印
- 面向对象-三大特性(OC代码)
- java socket 发送文件
- GRE词汇会难记到什么程度
- linux中断延迟之tasklet
- hibernate模拟实现