简单着色器编写(下)

函数部分介绍完了,最后来介绍一下main函数中的部分。

std::string vertexShader =

"#version 330 core\n"

"\n"

"layout(location=0)in vec4 position;"

"\n"

"void main()\n"

"{\n"

" gl_Position = position;\n"

"}\n";

std::string fragmentShader =

"#version 330 core\n"

"\n"

"layout(location=0)out vec4 color;"

"\n"

"void main()\n"

"{\n"

" color=vec4(1.0,0.0,0.0,1.0);\n"

"}\n";

  • std::string vertexShader:这是一个定义了顶点着色器源代码的字符串变量。

  • "#version 330 core\n":这是一行字符串,表示OpenGL的版本号和着色器的核心(core)版本,这里使用的是OpenGL 3.3 core profile。

  • "layout(location=0)in vec4 position;":这是顶点着色器的输入声明,指定了一个输入属性 position,它的位置索引是 0,表示顶点坐标。

  • "void main()\n":这是顶点着色器的主函数,它是着色器的入口点,用于对顶点进行处理。

  • "gl_Position = position;\n":这是顶点着色器的主要操作,将传入的顶点坐标赋值给内置的输出变量 gl_Position,这样OpenGL会将这个顶点坐标进行透视变换等操作,最终决定它在屏幕上的位置。

  • std::string fragmentShader:同理,这是定义了片元着色器源代码的字符串变量。

  • "layout(location=0)out vec4 color;":这是片元着色器的输出声明,指定了一个输出变量 color,它的位置索引是 0,表示输出的片元颜色。

  • "color=vec4(1.0,0.0,0.0,1.0);":这是片元着色器的主要操作,将输出的片元颜色设置为红色(RGBA为1.0, 0.0, 0.0, 1.0),从而在屏幕上渲染出红色的图像。

这两个着色器源代码字符串定义了如何处理顶点和片元,并且最终通过链接和使用程序对象来在屏幕上绘制一个红色的三角形。

有人可能会问,这不就是一些字符串吗,怎么发挥作用的?

这些确实是一些字符串,但在OpenGL中,这些字符串是用来定义着色器程序的源代码的。这些源代码描述了OpenGL如何处理顶点和片元数据,从而实现图形渲染。

当你将这些字符串传递给OpenGL的函数时,OpenGL会将它们编译成真正的着色器对象,这些对象可以在GPU上执行。编译后的着色器对象将根据你的代码逻辑进行计算,以及在屏幕上绘制出图像。

所以,这些字符串实际上是描述了一系列计算步骤的指令,这些指令会告诉GPU如何处理顶点数据、应用纹理、计算颜色等操作,最终呈现出你所期望的图形效果。虽然它们看起来只是普通的字符串,但在OpenGL的上下文中,它们承载着实际的图形渲染逻辑。

unsigned int shader = CreateShader(vertexShader,fragmentShader);

glUseProgram(shader);

unsigned int shader = CreateShader(vertexShader, fragmentShader); 这一行是用来创建一个着色器程序的过程。

具体来说,这行代码调用了之前定义的 CreateShader 函数,将顶点着色器代码 vertexShader 和片元着色器代码 fragmentShader 作为参数传递给该函数。函数内部会编译这两个着色器并链接成一个完整的着色器程序。最后,返回的 unsigned int 类型的值 shader 就代表了这个着色器程序的标识符。

这个着色器程序包含了定义的顶点着色器和片元着色器,通过调用 glUseProgram(shader) 可以激活这个着色器程序,从而在渲染时使用这些着色器对顶点和片元进行处理。

整个着色器的编写已经介绍完毕,让我们来看看最后的效果吧!

相关推荐
星竹晨L5 小时前
C++继承机制:面向对象编程的基石
开发语言·c++
9ilk6 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
c++·笔记·分布式·后端·中间件·rabbitmq
恒者走天下6 小时前
面试的时候项目怎么聊,才能发挥最大的价值
c++
阿巴~阿巴~7 小时前
线程局部存储(Thread-Local Storage, TLS)
linux·服务器·开发语言·c++·线程·虚拟地址空间·线程局部存储
杨筱毅7 小时前
【C++】【C++面试】Android SO 体积优化技术点梳理
c++·面试
万能的小裴同学7 小时前
C++ 鸭科夫手柄适配
开发语言·c++·算法
代码AC不AC7 小时前
【C++】哈希表实现 - 链地址法/哈希桶
c++·哈希算法·哈希·哈希桶·链地址法
小杰帅气8 小时前
STL_List简单使用
开发语言·c++·list
清辞8538 小时前
C++数据结构(链表和list)
数据结构·c++·链表
西哥写代码8 小时前
基于dcmtk的dicom工具 第十章 读取dicom文件图像数据并显示
c++·mfc·dcmtk·vs2017