C++ 长行字符串多行书写

问题

在使用C++编写图形学程序的时候往往会碰到需要将着色器代码变为字符串嵌入代码的情况。如何将着色器代码更简便快捷的用字符串表示出来便成为了一个问题。

解决方案

  1. 使用双引号
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);
            }
        )"";
    
    

    不过这个方法只对某一些比较简单的文本编辑器有用。

    注:对于着色器代码而言,每行都换行并非必要。这里仅将一段着色器代码作为例子使用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值