gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:13:19 24 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 的着色器编译器暴露了文件 的概念。这些字符串中的每一个都代表一个文件 的内容,编译时就好像这些文件 连接在一起一样。请注意,这个文件 在很大程度上与同名的文件系统无关。 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/40166601/

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