- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经尽力深入理解 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
是有符号整数类型,通常用于表示对象句柄和偏移量。还有其他的,例如 GLenum
和 GLvoid
。
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/
我正在尝试学习图形编程,并且编写了一个简单的 OpenGL 程序,该程序绘制一个三角形并将其着色为红色,但是当我为片段着色器调用函数 glShaderSource 时,它会导致段错误。 我不知道为什么
所以我一直收到错误“从 char** 到 const GLchar** 的无效转换”。我在这里阅读过关于此错误的类似帖子,但我似乎仍然无法修复它,因此非常感谢您的帮助。下面是我的 opengl c++
char buffer[1024]; memset(buffer, 0, sizeof(buffer)); FILE *vertexShaderFile = fopen(vertexShaderP
好的,我已经加载了一个 glVertex 着色器,作为来自 hexdump 的 const char 字符串。但是我从以下代码中得到一个编译器错误,我无法弄清楚为什么它拒绝编译它,并出现错误:
我已经尽力深入理解 OpenGL 的功能,但我对 glShaderSource 的参数有疑问: void glShaderSource( GLuint shader, GLsizei coun
由于 GLSL 没有包含文件选项,我试图通过使用“#pragma include”解析器来添加它。 (我想要这个是因为我有一些通用方法,我只想实现一次,但可能会在许多不同的着色器中使用,比如 Ken
我想知道 glShaderSource 在这种极端情况下的行为是否正确: glShaderSource(shader, 1, (const char**)ptr, length) 哪里: char *
因此,我正在尝试仅使用 Win32 API 和 OpenGL 来设置基本的 OpenGL 场景,但是我在加载着色器和 glShaderSource 函数方面遇到了很大的问题。我正在这样阅读我的文件:
我有以下代码: glShaderSource(shader, 1, (const char **)data.c_str(), NULL); 但这会使我的程序崩溃。如何将 std::string 转换为
我有一个存储在字符串值中的着色器: var myShader = " attribute vec4 a_position;" + " void main() {"
我正在尝试构建一个 OpenGL 应用程序。首先,我使用旧的固定功能管道进行绘图。然后我注意到这已经过时并且想切换到可编程管道。为此,我使用了网络上的一些教程。更改代码后,我尝试编译它,但我的编译器找
我正在尝试在 Mac 上使用库 GLFW3 编译一个相当简单的 C++ 程序。操作系统是 OS 10.9.3 (Maverick)。在我尝试使用 GLSL 函数(例如 glShaderSource 等
我是一名优秀的程序员,十分优秀!