string testShader =
"uniform mat4 g_mvpMatrix; \n"
"attribute vec3 position;\n"
"void main ()\n"
"{\n"
"gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0);\n"
"}\n";
缺点:需要每行都写‘\n’。更改后如果一行过长还须拆分成两行,比较麻烦。
- 在字符串换行处加一个反斜杠’\’
-
string testShader = "uniform mat4 g_mvpMatrix;\n\ attribute vec3 position;\n\ void main ()\n\ {\n\ gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0);\n\ }";
缺点:下一行前不能有空格或者Tab键,否则会有多余空格。需要每行都写‘\n’。
- 用带参数宏定义
-
#define MULTILINE(...) #__VA_ARGS__ ... string testShader = MULTILINE( uniform mat4 g_mvpMatrix;\n attribute vec3 position;\n void main ()\n {\n gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0);\n } );
缺点:想打多行的话仍然需要每行后写\n
- C++11 Raw String Literals
使用R"(…)"
-
string testShader = R"(uniform mat4 g_mvpMatrix; attribute vec3 position; void main () { gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0); } )";
这个方法最大的好处就是不用每一行打\n了。不过在大部分的文本编辑器中,代码可能会上色不正常。一个hack可以绕开代码上色不正常的问题。
使用R"“(…)”"
string testShader = R""(uniform mat4 g_mvpMatrix; attribute vec3 position; void main () { gl_Position = g_mvpMatrix * vec4(position.x, position.y, position.z, 1.0); } )"";
不过这个方法只对某一些比较简单的文本编辑器有用。
注:对于着色器代码而言,每行都换行并非必要。这里仅将一段着色器代码作为例子使用。