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**
,您可以使用&
。对不起,您使用&
是什么意思?通过“使用&
”我的意思是您引用了该对象。您可以获得指向该对象的指针。