OpenGL 编程指南(第八版)学习笔记——1 OpenGL概述

OpenGL 编程指南(第八版)学习笔记——1 OpenGL概述

转载自 https://blog.csdn.net/wlk1229/article/details/79394115

什么是OpenGL

  • OpenGL是一种应用程序编程接口 API.
  • OpenGL被设计为一个现代化的 / 硬件无关的接口.
  • 一个用来渲染图像的OpenGL程序需要执行的主要操作是:
    • 从OpenGL的几何图元中设置数据,用于构建形状
    • 使用不同的着色器(shader)对输入的图元数据执行计算操作,判断它们的位置,颜色,以及其他渲染属性.
    • 将输入的图元的数学描述转换为与屏幕位置对应的像素片元(gragment).这一步叫光栅化.
    • 最后针对光栅化过程所产生的每个片元,执行片元着色器(fragment),从而决定这个片元的最终颜色和位置.
    • 如果有必要,还需要对每个片元执行一些额外操作.例如,判断片元对应的对象是否可见,或着将片元的颜色与当前屏幕位置的颜色进行融合
  • 绘制流水线

img

  • OpenGL另一个本质的概念叫 着色器
    • 最常用的包括: 顶点着色器,片元着色器
    • 顶点着色器:处理顶点数据
    • 片元着色器:处理光栅化后的片元数据.
  • 最后生成的图像包含了屏幕上绘制的所有像素点.
    • 像素是显示器上最小的可见单元.
    • 所有像素都保存到 帧缓存framebuffer . 这是图形硬件设备管理的一块独立内存区域. 可以直接映射到最终的显示设备上.

OpenGL语法

  • 数据类型

OpenGL渲染管线

准备向OpenGL传递数据

  • OpenGL将所有的数据都保存到帧缓存对象中.它相当于由OpenGL服务器维护的一块内存区域.
  • glBufferData()

将数据传递到OpenGL

  • 绘制通常就是将顶点数据传递到OpenGL服务端.

顶点着色

细分着色

  • 细分着色器会用Patch来描述一个物体的形状
  • 并且模型的外观变得更为平滑

几何着色

  • 允许在光栅化之前对每个几何图元做进一步的处理.

图元装配

  • 图元装配阶段将这些顶点与相关的集合图元之间组织起来.

剪切

  • 顶点可能回落在视口之外,也就是绘制的窗口之外.此时与顶点相关的图元会做出改动.保证相关的像素不会在视点外绘制.这叫剪切.

光栅化

  • 将剪切后的图元传递给光栅化单元,生成对应的面片.可以将一个片元视为一个候选的像素.也就是放置在帧缓存中的像素.

片元着色

  • 使用着色器来计算片元的最终颜色和深度值.
  • 片元着色器非常强大,在这里回使用纹理映射的方式,对顶点处理阶段计算的颜色值进行补充.

逐片元操作

  • 深度测试 | z-buffering
  • 决定一个片元是否可见

使用OpenGL

  • main 函数
int main(int argc, char**argv)
{
	glutInit(&argc, argv); // 初始化GLUT
	glutInitDisplayMode(GLUT_RGBA); // 设置窗口类型
	glutInitWindowSize(512, 512); // 窗口代销
	glutInitContextVersion(4, 3); // 设置GL context
	glutInitContextProfile(GLUT_CORE_PROFILE);
	glutCreateWindow(argv[0]);// 创建窗口

	if (glewInit()) // GLEW可以简化获取函数地址的过程
	{
		cout << "Unable to initialize GLEW.. " << endl;
		return 1;
	}
	init(); // 初始化所有相关数据
	glutDisplayFunc(display); // 设置显示回调
	glutMainLoop(); // 无限执行的循环,它会负责一些处理窗口和用户输入
    // 当glutMainLoop判断窗口是否要进行重绘,则调用glutDisplayFunc注册的函数
}
  • init 函数
/// 顶点着色器
#version 430 core
layout(location = 0) in vec4 vPosition;
void
main()
{
    vec4 p = vPosition;
    gl_Position = p;
}

/// 片元着色器
#version 430 core
out vec4 fColor;
void
main()
{
    fColor = vec4(0.0, 0.0, 1.0, 1.0);
}

enum VAO_IDs {Triangles, NumVAOs};
enum Buffer_IDs {ArrayBuffer, NumBuffers};
enum Attrib_IDs {vPosition = 0};

GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];

const GLuint NumVertices = 6;
void init()
{
    // 分配了顶点数组对象
	glGenVertexArrays(NumVAOs, VAOs); // 返回n个未使用的对象名,放在arrays中.
	glBindVertexArray(VAOs[Triangles]);// 绑定对象
    
	GLfloat vertices[NumVertices][2] = { // 顶点数据
		{-0.9f,-0.9f},
		{0.85f,-0.90f},
		{-0.90f, 0.85f},
		{0.90f, -0.85f},
		{0.90f,0.90f},
		{-0.85f, 0.90f}
	};
    // 生成缓存对象
	glGenBuffers(NumBuffers, Buffers);
	// 激活顶点缓存对象 
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
	// 传递数据,
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
	// 初始化顶点与片元着色器 
	ShaderInfo shaders[] = { {GL_VERTEX_SHADER, "triangles.vert"},{GL_FRAGMENT_SHADER, "triangles.frag"},{GL_NONE, NULL} };
	
	program = LoadShaders(shaders);// 编译着色器
	glUseProgram(program);// 

    // 
    GLuint pos = glGetAttribLocation(program, "vPosition");
    // 设置index着色器的属性位置对应的数据值.
	glVertexAttribPointer(pos, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
	glEnableVertexAttribArray(pos);
}
  • display 函数
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT); // 清除指定的换成数据并设置为当前值
	glBindVertexArray(VAOs[Triangles]); // 
	glDrawArrays(GL_TRIANGLES, 0, 6); // 绘制!!! 

	glFlush(); // 强制所有当前的GL命令立即执行
	Sleep(30);//减少CPU的占用
}
  • 启用或禁用 OpenGL的操作
  • glEnable
  • glDisable
  • 有很多枚举量可以作为模式参数传入.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值