当前位置:嗨网首页>书籍在线阅读

14-C++代码文件结构

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.6 C++代码文件结构

目前为止,我们的所有C++/OpenGL应用程序代码都放在同一个叫作“main.cpp”的文件中,GLSL着色器代码放在“vertShader.glsl”和“fragShader.glsl”文件中。我们承认在main.cpp中塞进很多应用代码不是最佳实践,但我们在本书中采用这个约定,以便于在每个例子中,哪个文件包含这个例子中主要的C++/OpenGL代码这件事都很清楚。在本教材中,主要的C++/OpenGL文件总是叫作“main.cpp”。在实践中,应用程序当然应该模块化,以适当对应应用的各功能。

但是,当我们继续学习时,我们会遇到一些情况。在这些情况下,我们会创建一些实用的模块,并在不同的应用程序中使用。当时机适当,我们会将这些模块分离到单独的文件中以便重用。例如,稍后我们会定义一个Sphere类。这个类会在很多例子中用到,因此它会分到它自己的文件(Sphere.cpp和Sphere.h)中。

相似地,当我们遇到需要重用函数的时候,我们会把它们放进“Utils.cpp”(与“Utils.h”关联)。我们已经看到好几个适合放进“Utils.cpp”的函数了:2.2节中描述的错误检测模块和2.3节中描述的用来读入GLSL着色器的函数。后者非常适合重载,如“createShaderProgram()”可以对应用中所有可能的管线着色器组合进行定义:

•  GLuint Utils::createShaderProgram(const char *vp, const char *fp)
•  GLuint Utils::createShaderProgram(const char *vp, const char *gp, const char *fp)
•  GLuint Utils::createShaderProgram(const char *vp, const char *tCS, const char* tES, const char *fp)
•  GLuint Utils::createShaderProgram(const char *vp, const char *tCS, const char* tES, const char *gp,  
 const char *fp)

以上列出的第一个条目支持仅使用了顶点着色器和片段着色器的程序。第二个支持使用了顶点着色器、几何着色器和片段着色器的情况。第三个支持用了顶点着色器、曲面细分着色器和片段着色器的情况。第四个支持用了顶点着色器、曲面细分着色器、几何着色器和片段着色器的情况。每个条目中,接受的参数都包含着色器代码的GLSL文件路径。例如,如下调用使用了其中一个重载函数,以编译并链接包含顶点着色器和片段着色器的管线。编译链接后的程序被放在变量“renderingProgram”中:

renderingProgram = Utils::createShaderProgram("vertShader.glsl", "fragShader.glsl");

这些createShaderProgram()实现都可以在随书附赠的配套资源中找到(在“Utils.cpp”文件中),同时它们都包含了2.2节中的错误处理。它们并没有什么新内容,只是用这种方式组织以便使用。随着我们继续向前推进本书,会有更多相似的函数加入Utils.cpp。我们强烈鼓励读者阅读配套资源中的Utils.cpp文件,甚至有需要时可在其中加入函数。配套资源中的程序是根据学习本书的方法构建的,因此了解它们的结构应当有助加强自己对书中内容的理解。

我们对于在“Utils.cpp”文件中的函数,都以静态函数进行实现,因此不需要实例化Utils类。基于正在开发的系统架构,读者可能会倾向于使用实例方法甚至独立函数实现它们。

我们所有的着色器文件都使用“.glsl”后缀。