计算机图形学编程(使用OpenGL和C++)(第2版)
上QQ阅读APP看书,第一时间看更新

到目前为止,GLSL着色器代码已经内联存储在字符串中了。当程序变得更复杂时,这么做就不切实际了。我们应当将着色器代码存在文件中并读取它们。

读取文本文件是基础的C++技能,在此就不赘述了。但是,实用起见,用于读取着色器的代码readShaderSource()在程序2.4中提供。它能读取着色器文本文件并返回一个字符串数组(其中每个字符串是文件中的一行文本),然后根据读取的行数确定该数组的大小。注意,这里的createShaderProgram()取代了程序2.2中的版本。在本例中,顶点着色器和片段着色器代码现在分别放在文本文件vertShader.glsl和fragShader.glsl中。

程序2.4 从文件中读取GLSL源文件

// #includes与之前相同,main()、display()、init()也与之前相同,同时加入如下代码
#include <string>
#include <iostream>
#include <fstream>
...
string readShaderSource(const char *filePath) { 
    string content; 
    ifstream fileStream(filePath, ios::in); 
    string line = ""; 
    while (!fileStream.eof()) { 
        getline(fileStream, line); 
        content.append(line + "\n"); 
    } 
    fileStream.close(); 
    return content;
  }

  GLuint createShaderProgram() { 
    // 与之前相同,同时加入如下代码
    string vertShaderStr = readShaderSource("vertShader.glsl"); 
    string fragShaderStr = readShaderSource("fragShader.glsl"); 

    const char *vertShaderSrc = vertShaderStr.c_str(); 
    const char *fragShaderSrc = fragShaderStr.c_str(); 

    glShaderSource(vShader, 1, &vertShaderSrc, NULL); 
    glShaderSource(fShader, 1, &fragShaderSrc, NULL); 

    // 构建如前的渲染程序
}