在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程序员是否使用有助于这种组合的库或技术?
答案 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将采用原始字符串作为着色器源(通常通常通过库访问)。