OpenGL 编程指南(第八版)学习笔记1——OpenGL概述
Posted 雨尘无痕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL 编程指南(第八版)学习笔记1——OpenGL概述相关的知识,希望对你有一定的参考价值。
参考链接: https://blog.csdn.net/wlk1229/article/details/79394115
一、OpenGL概述:
OpenGL是一种应用程序编程接口。它是一种可以对图形硬件设备特性进行访问的软件库,OpenGL相当于一套操作显卡的API接口,显卡厂商(NVidia,ATI等)会对提供OpenGL的驱动
一个用来渲染图像的OpenGL程序需要执行的主要操作如下所示:
-
从OpenGL的几何图元中设置数据,用于构建形状
-
使用不同的着色器对输入的图元数据执行计算操作,判断它们的位置、颜色,以及其他渲染属性。
-
将输入图元的数学描述转换为与屏幕位置对应的像素片元。这一步称为光栅化
-
最后,针对光栅化过程产生的每个片元,执行片元着色器,从而决定这个片元的最终颜色和位置。
-
如果有必要,还需要对每个片元执行一些额外的操作,例如判断片元对应的对象是否可见,或者将片元的颜色与
当前屏幕位置的颜色进行融合
二、使用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_IDsArrayBuffer,NumBuffers;
enum Attrib_IDsvPosition = 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();
以上是关于OpenGL 编程指南(第八版)学习笔记1——OpenGL概述的主要内容,如果未能解决你的问题,请参考以下文章
在Win7(64位)使用VS2015运行《OpenGL编程指南》第八版第一章程序的方法
VS15 openGL 编程指南 配置库 triangle例子