Introducing three common techniques.
1. Using Variadic Macros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #define VERTEX_SHADER(...) "#version 300 es\n" #__VA_ARGS__ #define FRAGMENT_SHADER(...) "#version 300 es\n" #__VA_ARGS__
const char* TriangleVertexShader = VERTEX_SHADER( layout(location = 0) in vec4 vPosition; void main() { gl_Position = vPosition; } );
const char* TriangleFragmentShader = FRAGMENT_SHADER( precision mediump float; out vec4 FragColor; void main() { FragColor = vec4(0.0, 1.0, 0.0, 1.0); } );
|
2. Using Raw String Literal
1 2 3 4 5 6 7
| const char* vertexShaderSource = R"( #version 330 core layout(location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos, 1.0); } )";
|
3. Shader Files
vertexShader.glsl1 2 3 4 5
| #version 330 core layout(location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos, 1.0); }
|
Read file in C++:
1 2 3 4
| std::ifstream file("vertexShader.glsl"); std::stringstream buffer; buffer << file.rdbuf(); std::string vertexShaderSource = buffer.str();
|