GLSL 着色器读取缓冲区(指针)?

GLSL shader read buffer (pointers)?

真的不知道如何称呼标题,但我在看一些示例代码:

try
        {
            // Open files
            vShaderFile.open(vertexPath);
            fShaderFile.open(fragmentPath);
            std::stringstream vShaderStream, fShaderStream;
            // Read file's buffer contents into streams
            vShaderStream << vShaderFile.rdbuf();
            fShaderStream << fShaderFile.rdbuf();
            // close file handlers
            vShaderFile.close();
            fShaderFile.close();
            // Convert stream into string
            vertexCode = vShaderStream.str();
            fragmentCode = fShaderStream.str();
        }
        catch (std::ifstream::failure e)
        {
            std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
        }
        //Convert converted strings into c strings
        const GLchar* vShaderCode = vertexCode.c_str();
        const GLchar * fShaderCode = fragmentCode.c_str();
    // 2. Compile shaders
    GLuint vertex, fragment;
    GLint success;
    GLchar infoLog[512];
    // Vertex Shader
    vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &vShaderCode, NULL);
    glCompileShader(vertex);

它正在从另一个文件(在 class 中)读取着色器文件。它将它们作为字符串读入...有意义,然后将它们转换为 c 字符串(我假设),然后创建和编译着色器。

我想我的困惑是,正在获取流并将它们转换为字符串变量(vertexCode 和 fragmentCode)。然后我们调用 .c_str() (我假设将它们转换为 c 字符串)并将它们存储在一个名为 vShaderCode 和 fShaderCode 的指针中。

指针不会指向 c_string 本身吗?总的来说,我仍然不是 100% 了解指针……但是 GLchar* vShaderCode 不应该等于某物的地址吗?

然后我们往下看 &vShaderCode 所以我们指的是指针的地址....

我对这里发生的事情感到非常困惑。我仍然不是 100% 的指针,所以跟随 "memory map" 发生的事情令人困惑。

完整 class 示例,如有需要: http://www.learnopengl.com/code_viewer.php?type=header&code=shader

函数glShaderSource的目的是阅读GLSL源代码。现在我们如何用 C 表示明文源代码?嗯,单行源代码可以用char*来表示。然后,多行源代码可以由 char* 的数组表示,换句话说,char**.

因此将const GLchar**视为一个字符串数组,代表明文源代码。

现在只知道char**是不够的,我们还需要知道源代码的行数,即char*的数组大小。这就是 glShaderSource 的第二个参数的用途。您用它指定 char* 的数量。在您的示例中,它是 1,因为着色器源代码是 "flattened" 到一行(如果您在某处有一些 #define#version,这不是一个好主意GLSL代码)。

这样就解决了多少行代码的问题,但是接下来就是知道每行代码多长的问题了。这就是 glShaderSource 的第四个参数的用途。它是一个整数数组,指定每行源代码的长度。换句话说,它又是一个数组,即 int*。我们知道这个数组有多长,因为那正是 glShaderSource.

的第二个参数

当每行源代码都以空终止符([=25=])结尾时,无需指定每行源代码的长度。在这种情况下,可以将 NULL 指定为 glShaderSource 的第四个参数。然后 OpenGL 假定每个源代码行都是空终止的。