yos*_*o78 3 c c++ c-preprocessor
因此,就像许多过去处理过 OpenGL 着色器的人一样,一直希望能够编写它们而无需额外的程序将它们转换为字符串。所以我正在寻找一种用“\n”替换源代码中的 Enter presses\newline 字符的方法,例如:
const char *sShaderSrc =
ConvertTextToString(
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
uniform mat4 mModel;
uniform mat3 mNormal;
uniform mat4 mViewProj;
varying vec3 vNormal;
void main()
{
gl_Position = (mViewProj *mModel) * vec4(aPos,1.0) ;
vNormal = mNormal*aNormal;
}
)
;
Run Code Online (Sandbox Code Playgroud)
然后预处理器会将其转换为
const char *sShaderSrc =
"#version 330 core\n\nlayout (location = 0) in vec3 aPos;\nlayout (location = 1) in vec3 aNormal;\n\nuniform mat4 mModel;\nuniform mat3 mNormal;\nuniform mat4 mViewProj;\n\nvarying vec3 vNormal;\n\nvoid main()\n{\n gl_Position = (mViewProj *mModel) * vec4(aPos,1.0);\n vNormal = mNormal*aNormal;\n}\n"
;
Run Code Online (Sandbox Code Playgroud)
这样,如果 OpenGL 在编译时出错,我会在错误消息中得到着色器行号。
非常感谢您的帮助。我能想到的唯一边缘情况也是处理文本编辑器插入“\r\n”或“\n”的情况。
我努力了
#define RAWSTRINGIFY(x) R#x
//then you do
RAWSTRINGIFY((
//glsl code here...
))
Run Code Online (Sandbox Code Playgroud)
但无法直接插入
宏观解决方案(以及为什么它不能满足您的目的)
这可以实现为可变参数宏,以便它实际编译。
#define ConvertTextToString(...) #__VA_ARGS__
Run Code Online (Sandbox Code Playgroud)
不幸的是,有两个问题阻止它在该场景中发挥作用。
#version 330 core视为预处理器指令,这会导致这样的错误。对此没有解决方案。main.cpp:6:2: error: invalid preprocessing directive
#version 330 core
Run Code Online (Sandbox Code Playgroud)
使用原始字符串文字
您的预期用例(即多行字符串文字)的解决方案是在 C++ 中使用原始字符串文字。例如,
main.cpp:6:2: error: invalid preprocessing directive
#version 330 core
Run Code Online (Sandbox Code Playgroud)