如何在glsl中编写基本着色器?

薇薇

因此,我在学习OpenGL时偶然发现了与GLSL有关的问题。这是一本书的引用:

“我们要做的第一件事是用着色器语言GLSL编写顶点着色器,然后编译该着色器,以便我们可以在应用程序中使用它。”

然后提供了源代码:

#version 330 core
layout (location=0)in vec3 position;
void main()
{
gl_Position=vec4(position.x, position.y,position.z,1.0);
};

起初我很眼花。乱。这不能写在我的.cpp文件中,因为它不像C。我知道我应该创建.glsl文件或其他内容,但是书中没有具体说明。然后我找到了一个示例代码(这是用.cpp编写的):

//Shaders
const GLchar* vertexShaderSource = "#version 330 core\n"
"layout (location=0)in vec3 position;\n"
"void main()\n"
"{\n"
"gl_Position=vec4(position.x, position.y,position.z,1.0);\n"
"}\0";

...而且确实有效。但为什么?字符串是否已转换为文件,然后以某种方式被该方法读取glShaderSource();所有这些都没有在书中解释。

我的问题:

-此方法如何使用字符串作为参数并读取代码?

-这确实是一个漫长的过程。例如,我需要为每一行键入“”和“ \ n”。否则,如果没有'\ n,那将是非常无组织和丑陋的。有替代方法吗?

任何帮助是极大的赞赏。

尼科尔·波拉斯(Nicol Bolas)

此方法如何使用字符串作为参数并读取代码?

...通过使用字符串作为参数并读取代码。我知道这听起来很轻松,但这就是它的工作原理。

字符串只是一个字符串。您可以使用C ++中的字符串文字并阅读以下内容:

const char *str = "Here is a string.";
std::cout << str[3];

那将打印出“ e”,因为那是字符串中的第四个字母。

OpenGL所做的就是读取该字符串并进行处理。它识别并理解GLSL的语法,将文本转换为需要的内部表示形式,以便在GPU上执行该字符串描述的代码。实际上,它正在执行C ++编译器所执行的操作,但是在应用程序运行时正在执行此操作。

这确实是一个漫长的过程。例如,我需要为每一行键入“”和“ \ n”。否则,如果没有'\ n,那将是非常无组织和丑陋的。

不,你没有。在C ++ 11(几乎所有现代编译器都支持)中,可以使用原始字符串文字:

const GLchar *vertexShaderSource = R"(
#version 330 core
layout (location=0)in vec3 position;
void main()
{
    gl_Position=vec4(position.x, position.y,position.z,1.0);
};)";

原始字符串文字在遇到时会结束)"而且由于该"字符未在GLSL中使用,因此只有在您完成

有替代方法吗?

您可以从文件中加载它。您可以从数十个文件中整理出来。同一文件中可以包含数十个着色器,并使用特殊字符让您知道一个从哪里开始,另一个从哪里结束。您可以从SQLite数据库中检索它们。您可以根据从其他内容中读取的一些基本参数来手动构建这样的字符串。您可以从文件中加载字符串并对其执行一些正则表达式替换操作。和许多其他选择。

OpenGL不在乎OpenGL唯一关心的是,当您调用时glShaderSource,您给它的字符串必须符合OpenGL Shading Language的语法。

如何获得这样的字符串与OpenGL无关。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章