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

c++ 同时被 2 个专栏收录
5 篇文章 0 订阅
2 篇文章 0 订阅

参考链接: https://blog.csdn.net/wlk1229/article/details/79394115

一、OpenGL概述:

OpenGL是一种应用程序编程接口。它是一种可以对图形硬件设备特性进行访问的软件库,OpenGL相当于一套操作显卡的API接口,显卡厂商(NVidia,ATI等)会对提供OpenGL的驱动

一个用来渲染图像的OpenGL程序需要执行的主要操作如下所示:

  1.     从OpenGL的几何图元中设置数据,用于构建形状

  2.     使用不同的着色器对输入的图元数据执行计算操作,判断它们的位置、颜色,以及其他渲染属性。

  3.     将输入图元的数学描述转换为与屏幕位置对应的像素片元。这一步称为光栅化

  4.     最后,针对光栅化过程产生的每个片元,执行片元着色器,从而决定这个片元的最终颜色和位置。

  5.     如果有必要,还需要对每个片元执行一些额外的操作,例如判断片元对应的对象是否可见,或者将片元的颜色与

    当前屏幕位置的颜色进行融合

二、使用OpenGL
创建窗口和事件处理

OpenGL只是一套图形接口,并没有包含窗口的创建,鼠标键盘事件的处理,这些本身与平台相关而且复杂繁琐。为了处理这部分工作,我们使用了一个免费开源跨平台库freegult(https://sourceforge.net/projects/freeglut/),使用freegult可以很简单的创建OpenGL窗口处理窗口事件。Freegult官网提供可源代码,源代码使用的是cmake工程,我们可以使用cmake生成我们想要的工程文件,如VS2010,VS2015,makefile等等。

 

OpenGLAPI访问

因为OpenGL规范是不断在更新的,而操作系统更新并没有这么频繁,所以平台提供的OpenGL头文件和lib文件(windows上为gl.h和opengl32.lib)很难与最新版本OpenGL一致。为了防止编译链接错误,所以采用函数指针的方式访问OpenGL API。在Windows平台上用来获取OpenGL API函数指针的函数为wglGetProcAddress(LPCSTR),只需要提供一个Opengl函数名,如果平台支持,该函数会返回相应的函数指针,如何不支持则返回空指针。这部分工作也跟平台相关,且需要考虑各个OpenGL的版本,为了处理这部分工作我们使用了另一个开源跨平台库glew(http://glew.sourceforge.net/)。该库可以自动识别平台和OpenGL版本,并加载相应的函数。因为该库代代码量不多,文件(glew.h/glew.c)很少,我一般直接将该库代码包含到项目中使用。

本书中所有例子都使用了这两个库,Freegult和Glew。

绘制流水线

 

三、实现例子:

代码加分析:

#include <iostream>
using namespace std;

#include "stdio.h"
#include "vgl.h"
#include "LoadShaders.h"
#include "vmath.h"

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;

GLuint program;

void Init()
{
	//返回NumVAOs个未使用的对象名到数组arrays中,用作顶点数组对象
	glGenVertexArrays(NumVAOs, VAOs);
	//在生成一个顶点数组对象的名字后,绑定对象
	glBindVertexArray(VAOs[Triangles]);

	GLfloat vertices[Numvertices][2] = {
		{-0.9f,-0.9f},
		{0.0f,0.9f},
		{0.9f,-0.9f}
	};
	//顶点数组对象负责保存一系列顶点的数据,这些数据保存到缓存对象当中
	//分配顶点缓存对象
	glGenBuffers(NumBuffers, Buffers);
	glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
	//将数据载入缓存对象
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

	/*triangles.vert
	#version 430 core
	layout(location =0) in vec4 vPosition;
	void main()
	{
		gl_Position = vPosition;
	}
	triangles.frag
	fColor = vec4(0.0,0.0,1.0,1.0);
	*/
	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");
	//第一个参数 顶点着色器中输入变量的location值即vPosition
	//第二个数组中每个顶点的元素数目,第四个normalized,
	//第五个stride,每组数据值在内存中都是立即与下一组数据相衔接可以设置为0
	//第六个参数pointer,这里设置为0,数据从缓存对象的第一个字节(地址为0)开始的
	glVertexAttribPointer(pos, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
	glEnableVertexAttribArray(pos);
}

void display(void)
{
	//参数,缓存,包括颜色缓存、深度(GL_DEPTH_BUFFER_BIT)、模板(GL_STENCIL_BUFFER_BIT)
	glClear(GL_COLOR_BUFFER_BIT);
	glBindVertexArray(VAOs[Triangles]);
	//使用当前绑定的顶点数组元素来建立一系列的几何图元(第一个参数不同形状)
	glDrawArrays(GL_TRIANGLES, 0, 3);
	//强制所有进行中的OpenGl命令立即完成并传输到OpenGl服务器处理
	glFlush();
	Sleep(30);//减少CPU的占用
}

int main(int argc, char**argv)
{
	glutInit(&argc, argv);			//初始化GLUT库
	glutInitDisplayMode(GLUT_RGBA);	//设置了程序所使用的窗口类型
	glutInitWindowSize(512, 512);	//设置窗口大小,也可动态设置大小
	//设置所需的OpenGL环境,使用OpenGL4.3版本的核心模式创建环境
	glutInitContextVersion(4, 3);		
	glutInitContextProfile(GLUT_CORE_PROFILE);
	glutCreateWindow(argv[0]);		
	
	//属于辅助库GLEW,简化获取函数地址的过程,包含了可以跨平台使用的OpenGL编程方法
	if (glewInit())			
	{
		cout << "Unable to initialize GLEW.." << endl;
		return 1;
	}

	Init();
	
	//设置了显示回调,即GLUT在每次更新窗口内容的时候会自动调用的例程
	//Glut可以使用一系列回调函数来处理诸如用户输入、重设窗口尺寸等不同操作
	glutDisplayFunc(display);
	//这是一个无限执行的循环(不会执行之后的命令),负责处理窗口和操作系统的用户输入操作
	//会判断窗口是否需要进行重绘,然后自动调用glutDisplayFunc中注册的函数
	glutMainLoop();		
}

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

学习OpenGL的不二选择……本书对OpenGL以及OpenGL实用函数库进行了全面而又权威的介绍,素有“OpenGL红宝书”之誉。本书的上一个版本覆盖了OpenGL 2.1版的所有内容。本版涵盖了OpenGL 3.0和3.1的最新特性。本书以清晰的语言描述了OpenGL的功能以及许多基本的计算机图形技巧 目录 译者序 前言 第1OpenGL简介 1 1.1 什么是OpenGL 1 1.2 一段简单的OpenGL代码 3 1.3 OpenGL函数的语法 4 1.4 OpenGL是一个状态机 6 1.5 OpenGL渲染管线 6 1.5.1 显示列表 7 1.5.2 求值器 7 1.5.3 基于顶点的操作 7 1.5.4 图元装配 7 1.5.5 像素操作 8 1.5.6 纹理装配 8 1.5.7 光栅化 8 1.5.8 片断操作 8 1.6 与OpenGL相关的函数库 9 1.6.1 包含文件 9 1.6.2 OpenGL实用工具库(GLUT) 10 1.7 动画 13 1.7.1 暂停刷新 14 1.7.2 动画=重绘+交换 15 1.8 OpenGL及其废弃机制 17 1.8.1 OpenGL渲染环境 17 1.8.2 访问OpenGL函数 18 第2章 状态管理和绘制几何物体 19 2.1 绘图工具箱 20 2.1.1 清除窗口 20 2.1.2 指定颜色 22 2.1.3 强制完成绘图操作 23 2.1.4 坐标系统工具箱 24 2.2 描述点、直线和多边形 25 2.2.1 什么是点、直线和多边形 25 2.2.2 指定顶点 27 2.2.3 OpenGL几何图元 27 2.3 基本状态管理 31 2.4 显示点、直线和多边形 32 2.4.1 点的细节 32 2.4.2 直线的细节 33 2.4.3 多边形的细节 36 2.5 法线向量 41 2.6 顶点数组 43 2.6.1 步骤1:启用数组 44 2.6.2 步骤2:指定数组的数据 44 2.6.3 步骤3:解引用和渲染 46 2.6.4 重启图元 51 2.6.5 实例化绘制 53 2.6.6 混合数组 54 2.7 缓冲区对象 57 2.7.1 创建缓冲区对象 57 2.7.2 激活缓冲区对象 58 2.7.3 用数据分配和初始化缓冲区对象 58 2.7.4 更新缓冲区对象的数据值 60 2.7.5 在缓冲区对象之间复制数据 62 2.7.6 清除缓冲区对象 63 2.7.7 使用缓冲区对象存储顶点数组数据 63 2.8 顶点数组对象 65 2.9 属性组 69 2.10 创建多边形表面模型的一些提示 71 第3章 视图 77 3.1 简介:用照相机打比方 78 3.1.1 一个简单的例子:绘制立方体 80 3.1.2 通用的变换函数 83 3.2 视图和模型变换 84 3.2.1 对变换进行思考 85 3.2.2 模型变换 86 3.2.3 视图变换 89 3.3 投影变换 93 3.3.1 透视投影 94 3.3.2 正投影 95 3.3.3 视景体裁剪 96 3.4 视口变换 96 3.4.1 定义视口 96 3.4.2 变换深度坐标 97 3.5 和变换相关的故障排除 98 3.6 操纵矩阵堆栈 100 3.6.1 模型视图矩阵堆栈 101 3.6.2 投影矩阵堆栈 102 3.7 其他裁剪平面 102 3.8 一些组合变换的例子 104 3.8.1 创建太阳系模型 104 3.8.2 创建机器人手臂 107 3.9 逆变换和模拟变换 109 第4章 颜色 113 4.1 颜色感知 113 4.2 计算机颜色 114 4.3 RGBA和颜色索引模式 115 4.3.1 RGBA显示模式 116 4.3.2 颜色索引模式 117 4.3.3 在RGBA和颜色索引模式中进行选择 118 4.3.4 切换显示模式 118 4.4 指定颜色和着色模型 119 4.4.1 在RGBA模式下指定颜色 119 4.4.2 在颜色索引模式下指定颜色 120 4.4.3 指定着色模型 121 第5章 光照 123 5.1 隐藏表面消除工具箱 124 5.2 现实世界和OpenGL光照 125 5.2.1 环境光、散射光、镜面光和发射光 125 5.2.2 材料颜色 126 5.2.3 光和材料的RGB值 126 5.3 一个简单的例子:渲染光照球体 127 5.4 创建光源 129 5.4.1 颜色 130 5.4.2 位置和衰减 131 5.4.3 聚光灯 132 5.4.4 多光源 133 5.4.5 控制光源的位置和方向 133 5.5 选择光照模型 138 5.5.1 全局环境光 138 5.5.2 局部的观察点或无限远的观察点 138 5.5.3 双面
OpenGL图形系统是一个软件接口 让程序员能够创建交互式程序 使用计算机图形学技术生成具有真实感的图像 本书是OpenGL ARB推荐的OpenGL 1 4版学习指南 本书首先阐述OpenGL的功能和计算机图形学基本知识 包括状态管理和几何体的绘制 模型变换 视点变换和投影变换 颜色和光照;然后深入探讨一些高级技术 包括反走样 雾阄 显示列表 图像处理 纹理映射 帧缓存 网格化 NURBS 选择和反馈等;同时讨论其他一些重要主题 像如何提高程序的性能 OpenGL扩展和跨平台技术等 本书只要求读者有一定的C语言基础和数学知识 适合所有对OpenGL编程感兴趣的读者阅读 OpenGL是一个功能强大的软件接口 用于绘制高质量的计算机图像 以及编写使用2D和3D几何物体及位图和图像的交互式应用程序 本书介绍OpenGLOpenGL实用库 内容全面 权威 被称为“OpenGL红宝书” 本书第三版针对的是OpenGL1.2版 而本版介绍了OpenGL1.3和1.4版新增的所有特性以及重要的OpenGL ARB OpenGL体系结构审核委员会 扩展 本书以清晰的语言阐述了OpenGL的功能以及众多计算机图形学基本技术 如构建和渲染3D模型 从不同的角度观察物体 使用着色 光照和纹理映射来提高图像的真实感;深入探讨了一些高级技术 其中包括纹理映射 反走样 雾效和大气效果 NURBS 图像处理等;讨论了其他一些重要主题 如提高性能 OpenGL扩展和跨平台技术等 ">OpenGL图形系统是一个软件接口 让程序员能够创建交互式程序 使用计算机图形学技术生成具有真实感的图像 本书是OpenGL ARB推荐的OpenGL 1 4版学习指南 本书首先阐述OpenGL的功能和计算机图形学基本知识 包括状态管理和几何 [更多]
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

雨尘无痕

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值