在OpenGL初始化期间,程序应该执行类似以下的操作:
<Get Shader Source Code>
<Create Shader>
<Attach Source Code To Shader>
<Compile Shader>
获取源代码可能就像将其放入字符串中一样简单: (示例来自SuperBible,第6版)
static const char * vs_source[] =
{
"#version 420 core \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n"
"} \n"
};
问题在于直接在字符串中编辑、调试和维护GLSL着色器很困难。因此,从文件中获取源代码的字符串对于开发来说更加容易:
std::ifstream vertexShaderFile("vertex.glsl");
std::ostringstream vertexBuffer;
vertexBuffer << vertexShaderFile.rdbuf();
std::string vertexBufferStr = vertexBuffer.str();
// Warning: safe only until vertexBufferStr is destroyed or modified
const GLchar *vertexSource = vertexBufferStr.c_str();
现在的问题是如何将着色器与程序一起传输?事实上,将源代码与应用程序一起传输可能会成为问题。 OpenGL支持“预编译二进制着色器”,但是Open Wiki指出:
程序二进制格式不应被传输。 不合理的是期望不同的硬件供应商接受相同的二进制格式。 不合理的是期望来自同一供应商的不同硬件接受相同的二进制格式。 [...]
如何实际地将GLSL着色器与C++软件一起传输?