gpt4 book ai didi

c++ - 如何使用 C++ 软件实际交付 GLSL 着色器

转载 作者:IT老高 更新时间:2023-10-28 13:58:43 33 4
gpt4 key购买 nike

在 OpenGL 初始化期间,程序应该执行以下操作:

<Get Shader Source Code>
<Create Shader>
<Attach Source Code To Shader>
<Compile Shader>

获取源代码可以很简单,只需将其放入一个字符串中,例如:(示例取自 SuperBible, 6th Edition)

static const char * vs_source[] =
{
"#version 420 core \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n"
"} \n"
};

问题在于很难直接在字符串中编辑、调试和维护 GLSL 着色器。所以从文件中获取字符串中的源代码更容易开发:

std::ifstream vertexShaderFile("vertex.glsl");
std::ostringstream vertexBuffer;
vertexBuffer << vertexShaderFile.rdbuf();
std::string vertexBufferStr = vertexBuffer.str();
// Warning: safe only until vertexBufferStr is destroyed or modified
const GLchar *vertexSource = vertexBufferStr.c_str();

现在的问题是如何将着色器与您的程序一起发布?实际上,随您的应用程序提供源代码可能是个问题。 OpenGL 支持“预编译的二进制着色器”,但 Open Wiki声明:

Program binary formats are not intended to be transmitted. It is not reasonable to expect different hardware vendors to accept the same binary formats. It is not reasonable to expect different hardware from the same vendor to accept the same binary formats. [...]

如何在您的 C++ 软件中实际使用 GLSL 着色器?

最佳答案

使用 c++11,您还可以使用原始字符串文字的新功能。将此源代码放在名为 shader.vs 的单独文件中:

R"(
#version 420 core

void main(void)
{
gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
}
)"

然后将其导入为这样的字符串:

const std::string vs_source =
#include "shader.vs"
;

其优点是易于维护和调试,并且在 OpenGL 着色器编译器出现错误的情况下,您可以获得正确的行号。而且您仍然不需要发布单独的着色器。

我能看到的唯一缺点是在文件的顶部和底部添加了行(R"))"),语法有点将字符串转换为 C++ 代码有点奇怪。

关于c++ - 如何使用 C++ 软件实际交付 GLSL 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20443560/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com