当前位置: 首页 > news >正文

简单着色器编写(中下)

这篇我们来介绍另一部分函数。

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 是一个用于确保程序对象正确性的步骤,可以在链接和使用程序之前进行调用。

 

http://www.lryc.cn/news/145352.html

相关文章:

  • matlab使用教程(24)—常微分方程(ODE)求解器
  • 企业级数据共享规模化模式
  • Web服务器-Tomcat详细原理与实现
  • ARM处理器核心概述
  • 万户协同办公平台 ezoffice存在未授权访问漏洞 附POC
  • 使用ctcloss训练矩阵生成目标字符串
  • 驱动 - 20230829
  • 数组(个人学习笔记黑马学习)
  • layui表格事件分析实例
  • Android NDK JNI与Java的相互调用
  • 装备制造企业如何执行精益管理?
  • PHP8中自定义函数-PHP8知识详解
  • 虚拟化技术:云计算发展的核心驱动力
  • 光伏+旅游景区
  • 手搓文本向量数据库(自然语言搜索生成模型)
  • EVO大赛是什么
  • linux中使用clash代理
  • Kafka3.0.0版本——Follower故障处理细节原理
  • 13.redis集群、主从复制、哨兵
  • linux字符串处理
  • Nginx入门——Nginx的docker版本和windows版本安装和使用 代理的概念 负载分配策略
  • Zebec Protocol:模块化 L3 链 Nautilus Chain,深度拓展流支付体系
  • Oracle-rolling upgrade升级19c
  • Spring IOC详解
  • Unity——DOTween插件使用方法简介
  • 数据库——Redis 单线程模型详解
  • leetcode 567. 字符串的排列(滑动窗口-java)
  • Git —— 分支重命名操作
  • JavaIO流
  • FlinkSql 如何实现数据去重?