这篇我们来介绍另一部分函数。
static unsigned int CreateShader(const std::string& vertexShader, const std::string& fragmentShader)
{
unsigned int program = glCreateProgram();
unsigned int vs = CompileShader(GL_VERTEX_SHADER,vertexShader);
unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glValidateProgram(program);
glDeleteShader(vs);
glDeleteShader(fs);
return program;
}
static unsigned int CreateShader(const std::string& vertexShader, const std::string& fragmentShader)
-
static
:这个关键字表示函数是静态的,属于类或命名空间,而不是特定的对象实例。它可以通过类名或命名空间名直接调用,而无需创建对象。 -
unsigned int
:这是函数的返回类型,表示返回一个无符号整数,即程序对象的标识符。 -
CreateShader
:这是函数的名称,表示创建一个OpenGL程序对象。 -
const std::string& vertexShader
:这是一个传入的参数,表示顶点着色器的源代码。参数类型是一个常量引用,表示函数不会修改传入的字符串。 -
const std::string& fragmentShader
:这是另一个传入的参数,表示片元着色器的源代码。同样,参数类型是一个常量引用。
整个函数的作用是,它会创建一个OpenGL程序对象,并将顶点着色器和片元着色器编译后的标识符附加到该程序对象上,然后返回程序对象的标识符,供后续使用。通过这个函数,你可以方便地创建一个包含多个着色器的程序对象,从而进行渲染操作。
unsigned int program = glCreateProgram();
-
unsigned int program
:这是一个变量声明,表示创建的OpenGL程序对象的标识符将会存储在名为program
的变量中。变量的类型是无符号整数,因为OpenGL中的对象都用整数标识符来表示。 -
glCreateProgram()
:这是一个OpenGL函数调用,用于创建一个程序对象,并返回一个表示程序对象的标识符。这个标识符是一个无符号整数,用于在后续的操作中标识和操作这个程序对象。
通过这行代码,创建了一个程序对象并获得了它的标识符,以便在后续的代码中使用这个程序对象进行着色器附加、链接和使用等操作。
unsigned int vs = CompileShader(GL_VERTEX_SHADER,vertexShader);
unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
-
unsigned int vs
:这是一个变量声明,表示编译顶点着色器后的着色器对象标识符将存储在名为vs
的变量中。变量的类型是无符号整数,用于标识顶点着色器对象。 -
CompileShader(GL_VERTEX_SHADER, vertexShader)
:这是一个函数调用,调用了之前定义的CompileShader
函数,传入顶点着色器的源代码和着色器类型GL_VERTEX_SHADER
。这个函数会编译顶点着色器并返回顶点着色器对象的标识符,这个标识符被赋值给变量vs
。 -
unsigned int fs
:同理,这是一个变量声明,表示编译片元着色器后的着色器对象标识符将存储在名为fs
的变量中。 -
CompileShader(GL_FRAGMENT_SHADER, fragmentShader)
:这个函数调用类似于前面的顶点着色器编译,传入片元着色器的源代码和着色器类型GL_FRAGMENT_SHADER
。这个函数会编译片元着色器并返回片元着色器对象的标识符,这个标识符被赋值给变量fs
。
通过这两行代码,编译了顶点着色器和片元着色器,获取了它们的着色器对象标识符,以便后续附加到程序对象中。
glAttachShader(program, vs);
glAttachShader(program, fs);
-
glAttachShader(program, vs)
:这行代码调用了OpenGL函数glAttachShader
,将顶点着色器对象(存储在变量vs
中)附加到程序对象program
上。这是将多个着色器组合成一个程序的第一步。 -
glAttachShader(program, fs)
:类似于前一行,这行代码将片元着色器对象(存储在变量fs
中)附加到同一个程序对象program
上。
通过这两行代码,将编译后的顶点着色器和片元着色器对象附加到一个程序对象上,为后续的链接和使用做准备。程序对象是OpenGL中的一个重要概念,它代表了一组着色器以及其他OpenGL状态的集合,用于实现图形渲染。
glLinkProgram(program);
-
glLinkProgram(program)
:这是一个OpenGL函数调用,调用了函数glLinkProgram
,它接受一个程序对象的标识符作为参数,这里是变量program
。这个函数的作用是将程序对象中附加的着色器链接在一起,形成一个可以执行的OpenGL程序。
链接程序的过程会将不同的着色器阶段(如顶点着色器、片元着色器)连接在一起,并生成一个可执行的图形渲染管线。链接程序时还会进行一些错误检查和优化操作,以确保程序能够正确运行。
在这行代码之后,程序对象将具有一个链接好的着色器程序,可以用来进行渲染操作。如果链接成功,程序就可以被使用,否则需要检查错误信息并进行修正。
glValidateProgram(program);
-
glValidateProgram(program)
:这是一个OpenGL函数调用,调用了函数glValidateProgram
,它接受一个程序对象的标识符作为参数,这里是变量program
。这个函数会验证程序对象,检查它是否已经正确链接,并且是否能在当前OpenGL上下文中运行。
验证程序可以帮助你捕捉一些链接和使用中的错误,比如着色器之间的不一致,着色器中的语法错误等。如果验证失败,你可以通过查询程序对象的信息日志来了解错误的具体原因。
总之,glValidateProgram
是一个用于确保程序对象正确性的步骤,可以在链接和使用程序之前进行调用。文章来源:https://www.toymoban.com/news/detail-668339.html
文章来源地址https://www.toymoban.com/news/detail-668339.html
到了这里,关于简单着色器编写(中下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!