gpt4 book ai didi

opengl - glShaderSource的参数是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 22:23:54 32 4
gpt4 key购买 nike

我已尽力深入了解 OpenGL 的功能,但我对 glShaderSource 的参数有疑问:

void glShaderSource(
GLuint shader,
GLsizei count,
const GLchar * const * string,
const GLint * length);

我对最后两个参数感到困惑。它们在 C++ 中的实际含义是什么?这是否意味着如果可能的话,我给它一个字符串、一个 const char 或一个字符串指针?为什么?

最佳答案

glShaderSource 需要两个相关的值序列(C 样式数组)。

第一个序列是一个 C 字符串数组,无论是否以零结尾。

第二个序列是一个整数数组,表示第一个序列中每个字符串的长度。如果字符串以零结尾,则此序列是可选的,因为库会自行查找长度。

以 GL 为前缀的类型是因为 OpenGL 规范需要讨论类型而不会将自身与特定语言绑定(bind),因此它引入了常见 C 类型的别名。

GLchar 是一种类似于C char 的类型,用于表示窄字符。GLint 是有符号整数类型,通常用于表示对象句柄和偏移量。还有其他的,例如 GLenumGLvoid

GLchar const*char const* 类型的 OpenGL 拼写。除了用于指向单个字符外,它通常用于表示一串字符。当用于该含义时,它应指向一个字符序列,以标记值 '\0' 结束,以知道字符串结束。

之所以让glShaderSource 使用多个字符串,是因为OpenGL 的着色器编译器暴露了文件 的概念。这些字符串中的每一个都代表一个 file 的内容,并且它将像这些 files 连接在一起一样进行编译。请注意,这个 file 在很大程度上与同名的文件系统事物无关。 glShaderSource 只处理包含文本的字符串。

当您想要将一些片段组装到完整的着色器源中时,这很有用,例如,如果您想预先添加 #version 语句或一些常见的序言,或者已经实现了一些自己的某种包含指令。

举个例子说明如何使用:

std::string v = "#version 150\n";
std::string c = ReadTextFile("common.glsl"); // read a string with the file contents
std::string s = ReadTextFile("mesh.vert"); // same here

GLchar const* files[] = { v.c_str(), c.c_str(), s.c_str() };
GLint lengths[] = { v.size(), c.size(), s.size() };

glShaderSource(id, 3, files, lengths);

在这里,我们将三个字符串组合在一起,以便 OpenGL 将其视为一大块源文本。请注意,我的便利函数 ReadTextFile 将文件系统文件的内容读入字符串,OpenGL 的任何部分都不会触及文件系统。如果要将文本文件、图像文件或网格文件的内容获取到 OpenGL 结构中,则需要提前自己读入。

关于opengl - glShaderSource的参数是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22100408/

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