Opengl复习笔记(一)——顶点着色器、片段着色器(内含代码)

好的,又是因为要面试,这个面试需要复习opengl、图像算法、机器学习、算法题。所以会写相应的系列文章。。。

基础架构介绍

首先opengl是一个做显示的的东西。首先对他的一个基本流程有一个初步的概念。
常见的工作流程:

  1. 创建一个对象,用一个id保存他的应用
  2. 将对象绑定至上下文的目标位置(比如窗口对象)
  3. 设置绑定的一些选项
  4. 进行一系列的操作
  5. 将目标位置对象id设置回0,解绑这个对象

opengl的搭建可以借助vs2017,在nuget安装nupengl
安装之后可以试一下跑一个最简单的函数

//初始化 glut
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(SCR_WIDTH, 70);
	glutInitWindowSize(SCR_WIDTH, SCR_HEIGHT);
	glutCreateWindow("test");
	// 初始化 glew(功能与glad类似)
	glewInit();

	// 程序中需要的初始化,比如加载shader、加载文字、加载素材等
	init();
	glutTimerFunc(20, timer, 0);
	// 设置主函数
	glutDisplayFunc(display);
	glutKeyboardFunc(keyboard);
	glutMouseFunc(MouseEvent);
	glutMotionFunc(MotionMove);
	// 主函数循环
	glutMainLoop();

顶点着色器、片段着色器

我们能看到的三维效果其实也是一系列的变化后的二维图片,这个过程就是opengl图像渲染管线要干的事。其实随着技术的迭代跟新,已经由传统的顶点着色器和片段着色器,衍生了很多别的部分,如下图所示
在这里插入图片描述
针对顶点着色器:

  1. 顶点做色器主要作用是指定形状
  2. 以数组(顶点数据)的形式传递3个3D坐标作为这个过程的输入
  3. 顶点数据含有顶点属性,最简单的顶点属性是颜色,初此之外还有法向量等
  4. 为了让opengl知道你的这个顶点需要构成什么,需要制定一个模式,常见的有GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。如果是point,那么opengl会一个个读数组数据,如果是triangle则三个三个的读数组数据。即使三角形,也分为下面几种的绘制方式。这主要影响数组中数据排列方式。
    在这里插入图片描述
    针对片段着色器:
    1.片段着色器主要指定颜色、光照、阴影等光影效果。

顶点输入

顶点包括x、y和z方向,需要注意,要将数据归一化到 [-1,1] 这个区间。
比如这是一组顶点数据

float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};

绘制出来的的三角形如下
在这里插入图片描述
在高级一点的版本里有顶点缓冲对象(VBO),它主要做缓存处理,如果不使用,顶点会一个个发送到显卡内存区,比较占CPU。

顶点着色器

下面是一个三角形的顶点着色器

#version 330 core
// 输入数据 aPos输入是一个(x,y)的向量
// aColor是一个4维向量
attribute vec2 aPos;
attribute vec4 aColor;
// 输出至片段着色器的数据
out vec4 Color;
void main()
{
   
	
	// color在顶点着色器里不用,直接输出
	Color=aColor;
	// gl_Position是内置函数,这里是4个参数,x,y,z还有alpha值,暂时alpha值为1
    gl_Position = vec4(aPos, 0.0, 1.0);
}

片段着色器

下面是一个三角形的顶点着色器

#version 330 core
// 从顶点着色器的输入
in vec4 Color;

void main()
{
       
	// gl_FragColor 是内置函数,这里是4个参数
    gl_FragColor = Color;
}

把上面过程串起来

最简单的串接步骤如下所示:

  1. 分别读Shader内容(readShaderSource函数)
  2. 分别编译为顶点着色器、片段着色器(genShader函数)
  3. 把同一组的顶点着色器、片段着色器连接起来(linkProgram函数)

因为这个步骤比较程式化,所以写好一个shader读取函数基本就是通用变了。

我这里贴出我自己的一个框架:

static char* readShaderSource(const char *fileName)
{
   
	FILE *fp;
	char *content = NULL;
	int count = 0;

	if (fileName != NULL)
	{
   
		fp = fopen(fileName, "rt");

		if (fp != NULL)
		{
   
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,关于绘制多边形,我会为您提供一些OpenGL学习笔记。 首先,我们需要了解一下OpenGL绘制多边形的基本流程。OpenGL绘制多边形的过程包括三个基本步骤:指定顶点数据、指定绘制方式和执行绘制。 指定顶点数据:在OpenGL中,我们可以使用glVertex等函数来指定多边形的顶点。例如,如果我们要绘制一个三角形,我们可以使用以下代码: ``` glBegin(GL_TRIANGLES); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); ``` 其中,glBegin和glEnd函数用来指定绘制的方式,GL_TRIANGLES表示绘制三角形。glVertex3f函数用来指定三角形的三个顶点,每个顶点由三个坐标值组成。 指定绘制方式:OpenGL支持多种绘制方式,例如GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN等。在上面的代码中,我们使用了GL_TRIANGLES来指定绘制三角形的方式。 执行绘制:最后,我们需要调用glDrawArrays函数来执行绘制。例如,如果我们要绘制一个三角形,我们可以使用以下代码: ``` glDrawArrays(GL_TRIANGLES, 0, 3); ``` 其中,GL_TRIANGLES表示绘制三角形的方式,0表示顶点数组的起始位置,3表示顶点的数量。 以上就是OpenGL绘制多边形的基本流程,下面我们来看一下如何绘制着色多边形。 绘制着色多边形的过程与绘制普通多边形的过程基本相同,只需要在绘制前调用glColor函数来指定颜色即可。例如,如果我们要绘制一个红色的三角形,我们可以使用以下代码: ``` glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); // 指定颜色为红色 glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); ``` 其中,glColor3f函数用来指定颜色,三个参数分别表示红、绿、蓝三个颜色通道的值,取值范围为0到1。 希望以上内容能够帮助到您。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值