简单着色器编写(中下)

这篇具有很好参考价值的文章主要介绍了简单着色器编写(中下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

到了这里,关于简单着色器编写(中下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenGL和OpenGL ES显示YUV图片的着色器差别(一)

    这里解释的只是用于显示YUV图片的代码,没有增加任何效果: OpenGL 的片段着色器片段: OpenGL 的顶点着色器片段: OpenGL ES 的片段着色器片段: OpenGL ES的顶点着色器片段: 差别: 添加了  #version 320 es  指令,指定使用 OpenGL ES 3.2 版本。 使用  in  和  out  替代了原来

    2024年02月02日
    浏览(39)
  • OpenGL ES 3.0 着色器程序二进制化

    之前有位读者提问:C++ 如何将 OpenGL ES 的着色器程序二进制(保存),然后在其他地方加载使用?现在写篇文章介绍下。 将着色器程序二进制化(Shader Program Binary)有哪些好处? 快速加载和解析 :使用二进制形式的着色器程序可以更快地加载和解析,因为不需要进行编译和

    2024年02月07日
    浏览(44)
  • OpenGL ES 2.0 for Android教程(二):定义顶点和着色器

    文章传送门 OpenGL ES 2.0 for Android教程(一) OpenGL ES 2.0 for Android教程(三) OpenGL ES 2.0 for Android教程(四) OpenGL ES 2.0 for Android教程(五) OpenGL ES 2.0 for Android教程(六) OpenGL ES 2.0 for Android教程(七) OpenGL ES 2.0 for Android教程(八) OpenGL ES 2.0 for Android教程(九) 本章介绍我们

    2023年04月14日
    浏览(43)
  • OpenGL ES 2.0 for Android教程(三):编译着色器并绘制到屏幕

    文章传送门 OpenGL ES 2.0 for Android教程(一) OpenGL ES 2.0 for Android教程(二) OpenGL ES 2.0 for Android教程(四) OpenGL ES 2.0 for Android教程(五) OpenGL ES 2.0 for Android教程(六) OpenGL ES 2.0 for Android教程(七) OpenGL ES 2.0 for Android教程(八) OpenGL ES 2.0 for Android教程(九) 本章将继续我

    2023年04月26日
    浏览(60)
  • 【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言私信~~~ 虽然OpenGL的三维制图功能非常强大,但是它主要为计算机设计的,对于嵌入式设备和移动端设备来说显得比较臃肿,所以业界又设计了专供嵌入式设备的OpenGL ES 它相当于OpenGL的精简版,因为嵌入式设备追求性价比,所以能不做的

    2024年02月04日
    浏览(51)
  • vscode shadertoy插件,非常方便的glsl着色器编写工具

    很著名的shadertoy网站,集合了非常多大神利用数学写出美妙的shader效果。像shadertoy创始人之一的IQ大神它在这方面有很多的建树。他的利用光线步进和躁声可以创建很多不可思议的3D场景。  vscode有一件shadertoy的插件,安装后可以新建一个*.glsl文件,写好代码就可以直接运行看

    2024年04月09日
    浏览(36)
  • OpenGL ES入门教程(一)编写第一个OpenGL程序

    从本文开始我将参考学习OpenGL ES应用开发实践指南 Android卷 [(美)KevinBrothaler著](提取码: 394m),并基于自己的理解以更加通俗易懂的方式讲解如何应用OpenGL ES。本系列教程的目标是应用OpenGL,所以不会涉及太多的理论知识,主要讲解方式是基于简单功能的代码拆解,学会对

    2024年02月06日
    浏览(49)
  • 让AI臣服,而不是被它替代!让ChatGPT为我们编写Unity3d Shaderlab的着色器(shader)

    ChatGPT的火热大家应该都有目共睹,文案工作者、翻译工作者和画师等各种行业都在被嘲即将失业。不光是这些岗位的员工,作为资深社畜程序猿也能感受到会受到冲击。网上很多人都在发ChatGPT写的代码,并开始大肆宣扬AI要取代程序员了,今天测一测使用ChatGPT来生成一些代码,

    2023年04月23日
    浏览(47)
  • 区间图着色问题:贪心算法设计及实现

    在本文中,我们将探讨如何使用贪心算法解决一个特定的资源分配问题,即区间图着色问题。该问题可以描述为将一系列活动分配到最少数量的教室中,其中任意活动都可以在任意教室进行,但两个不兼容的活动不能安排在同一教室。我们将通过构造一个区间图来模拟这一问

    2024年04月27日
    浏览(40)
  • 计算机图形学,OpenGL编写的一个可实现旋转缩放移动的房间,内有数十种交互

    #include stdlib.h #includestdio.h #includewindows.h #include GL/glut.h #include math.h #include gl/GLU.h //颜色宏定义 #define white 1.0f, 1.0f, 1.0f #define black 0.0f, 0.0f, 0.0f #define red 1.0f, 0.0f, 0.0f #define blue 0.0f, 0.0f, 1.0f #define skyBlue 135.0/255.0, 206.0/255.0, 1.0f #define plum 1.0f, 187.0/255.0, 1.0f //浅紫色 #define pink 1.0f, 1

    2024年04月17日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包