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

C++ GLSL着色器读取缓冲区(指针)?,c++,pointers,opengl,glsl,C++,Pointers,Opengl,Glsl,我真的不知道该怎么称呼标题,但我正在看一些示例代码: try { // Open files vShaderFile.open(vertexPath); fShaderFile.open(fragmentPath); std::stringstream vShaderStream, fShaderStream; // Read file's buffer con

我真的不知道该怎么称呼标题,但我正在看一些示例代码:

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);
试试看
{
//打开文件
vShaderFile.open(垂直);
fShaderFile.open(fragmentPath);
std::stringstream-vShaderStream、fShaderStream;
//将文件的缓冲区内容读入流

vShaderStream函数
glShaderSource
的目的是读取GLSL源代码。现在我们如何用C表示纯文本源代码?好的,一行源代码可以用
char*
表示。然后多行源代码可以用那些
char*
的数组表示,换句话说,用
char**

因此,将
常量GLchar**
视为一个字符串数组,表示纯文本源代码

现在,仅仅知道
char**
是不够的,我们还需要知道源代码中的行数,即
char*
数组的大小。这就是
glShaderSource
的第二个参数的作用。您可以用它指定
char*
的数量。在您的示例中,它是
1
,因为der源代码被“展平”为一行(如果您的GLSL代码中有一些
#define
#version
,这不是一个好主意)

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


当源代码的每一行都以空终止符结尾时(
\0
),不需要指定每行源代码的长度。在这种情况下,可以指定
NULL
作为
glShaderSource
的第四个参数。然后OpenGL假设每行源代码都以NULL结尾。

阅读第一条:您传递一个指向多个字符串的指针,这就是
1
的作用:there只有一个字符串为什么源代码只包含const GLchar*而不是**?是不是因为我们假设有一个字符串?是的,因为源代码是“扁平化的”对于一行,我们可以改为使用
char*
。要将其转换为
char**
,您可以使用
&
。对不起,您使用
&
是什么意思?通过“使用
&
”我的意思是您引用了该对象。您可以获得指向该对象的指针。