OpenGL学习笔记(二)Shader

今天来谈一谈两个基本的着色器VERTEX SHADER(顶点着色器) 和FRAGMENT SHADER(片段着色器)以及如何使用。在此之前,需要先说明的是,每一个着色器都有输入与输出,上一着色器的输出是往往是作为下一着色器的输入的。(意味着,每一个着色器的输入和输出形式都是固定的)。

编写顶点着色器

编写一个基础的顶点着色器(设置顶点的属性),我们需要:

  1. 版本申明

  2. 为输入变量创造类型为vec3的aPos容器并指定其位置值(location=15)(输入)1

  3. 设置顶点着色器的输出内容,其输出为vec4类型(输出)

  "#version 330 core                                                    \n  "
  "layout(location = 15) in vec3 aPos;                                  \n	  "
  "void main() {\n														  "
  "		gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);} \n			  ";

编译着色器

当声明完一个顶点着色器A后,我们需要做的就是编译着色器。着色器的编译都是一样的,只是在于着色器的类型不一样(顶点着色器,片段着色器等),以顶点着色器为例,着色器基本编译如下:

1.使用glCreateShader()创建一个类型为顶点着色器(GL_VERTEX_SHADER)的着色器B,glCreateShader()会返回该着色器的ID值2

unsigned int vertexShader;
vertexShader=glCreateShader(GL_VERTEX_SHADER);

2.将我们编写的顶点着色器附加到我们创建的着色器上,这里使用的是glShaderSource();

glShaderSource(创建的B着色器,A着色器的字符串数量,编写的A着色器的地址(真正的源码),)

glShaderSource(vertexShader,1,&vertexShaderSource,NULL);

3.最终,我们才要真正的编译着色器了,使用的是glCompileShader();

glCompileShader(vertexShader);

编写片段着色器

编写一个基础的片段着色器(设置栅格的颜色),我们需要:

  1. 版本申明

  2. 设置类型为vec4的片段着色器的输出(输出)

  3. 设置片段着色器的输出的内容

   const char* fragmentShaderSource =
   "#version 330 core                                 \n	  "
   "out vec4 FragColor;                               \n	  "
   "void main() {\n										  "
   "		FragColor = vec4(0.27f, 0.54f, 0.58f, 1.0f);}    \n  ";

着色器的编译同上,只是类型改为了片段着色器(GL_FRAGMENT_SHADER)。

着色器程序

在对着色器进行了编写与编译后,我们需要将这些着色器集成在一起成为一个着色器程序对象。

着色器对象就像一个模板,我们对不同的点集合使用某个已经定好了的着色器模板。比如精简几何风,欧式风等

创建着色器程序对象的基本流程如下:

1.创建一个着色器对象,使用的是glCreateProgramme()函数,该函数返回的也是一个ID值。

unsigned int shaderProgramme;
shaderProgramme = glCreateProgram();

2…将我们编写的着色器附加到我们创建的着色器对象上,使用的函数是glAttachShader(着色器程序,着色器);

然后将着色器对象与程序使用glLinkProgram();进行连接,成为一个着色器程序对象。

glAttachShader(shaderProgramme,vertexShader);
glAttachShader(shaderProgramme,fragmentShader);
glLinkProgram(shaderProgramme);

3.通过glUseProgram();使用创建的着色器程序对象(在相应的OpenGL窗口中)

glUseProgram(shaderProgramme);

4.用完记得使用glDeleteShader();删除各个着色器。

总结

通过以上的简单使用,不难发现,整个着色器的使用都是类似于

  • 自行创建一个着色器,
  • 将XXXX附加到创建的着色器上
  • 链接/编译

这样的一个过程。首先我们需要理解OpenGL是通过设定上下文(Context)进行的变换,基于这点,着色器的使用可以理解为,我们是通过设置属性来完成我们想要的界面显示,而这些属性的具体内容是通过另外一套(GLSL)构建的。


  1. in 与out:在顶点着色器和片段着色器的第二行使用了不同的关键字,分别是in 与out,代表了该着色器的输入与输出。 ↩︎

  2. ID在OpenGL中扮演了重要的角色,很多东西的创建和操作都是通过ID进行的。 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值