如何在C ++项目中组成着色器源?

时间:2018-09-16 18:44:24

标签: c++ opengl

在Javascript中使用WebGL,我可以像这样编写片段着色器:

  protected getShader(textureFunc: string, opline: string): string {
    return `
      float getTexel() {
        return getColorAsFloat(${textureFunc}(A, TexCoords));
      }
      void main() {
        setFragColor(${opline});
      }
      `;
  }

在这里,我使用一堆直接粘贴在代码中的动态参数来构建源。您如何在C ++项目中做到这一点?我正在寻找构建动态字符串而不是sprintf()std::cout <<的新颖方法。 OpenGL程序员是否使用有助于这种组合的库或技术?

2 个答案:

答案 0 :(得分:1)

C ++在该语言中缺少字符串插值功能。一个类似的C ++代码将是:

  std::string getShader(const std::string &textureFunc, const std::string &opline) const {
    return R"(
      float getTexel() {
        return getColorAsFloat()" + textureFunc + R"((A, TexCoords));
      }
      void main() {
        setFragColor()" + opline + R"();
      }
    )";
  }

或者,您可以使用一些类似snprintf的格式库:

  std::string getShader(const char *textureFunc, const char *opline) const {
    return Sn::sprintf(R"(
      float getTexel() {
        return getColorAsFloat(%1$s(A, TexCoords));
      }
      void main() {
        setFragColor(%2$s);
      }
    )", textureFunc, opline);
  }

在这里,我使用了自己的printf包装器,该包装器返回了std::string,具有POSIX位置参数语法。但是您可以找到适合该工作的任何其他格式库。

答案 1 :(得分:0)

核心语言

C ++ 完全不了解着色器。您几乎总是会使用库。各种可用的库有所不同。

做着色器工作时使用的库 I SFML,它具有一个方便的sf::Shader类。其他库将具有其他类。否则,原始OpenGL将采用原始字符串作为着色器源(通常通常通过库访问)。