天天看点

OpenGL学习(一)——基础知识与概念一、图形技术与术语二、入门指南三、第一个程序

目录

一、图形技术与术语

二、入门指南

2.1 什么是OpenGL

2.2 使用OpenGL

2.2.1 GLUT

2.2.2 GLEW

2.2.3 GLTools

2.3 OpenGL API特性

三、第一个程序

一、图形技术与术语

变换和投影:变换(transformation)和投影(projection)分别通过一种称为变换矩阵和投影矩阵的数学结构来进行旋转和讲3D坐标转化成二维屏幕坐标。

光栅化:光栅化(Rasterization)是把顶点数据转换为片元的过程,具有将图转化为一个个栅格组成的图象的作用,特点是每个元素对应帧缓冲区中的一像素。光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分的工作。第一部分工作:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分工作:分配一个颜色值和一个深度值到各个区域。把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置的像素及用于填充像素的颜色,这个过程称为光栅化,这是一个将模拟信号转化为离散信号的过程。

更多光栅化参考:

1、https://www.jianshu.com/p/54fe91a946e2?open_source=weibo_search

2、https://www.cnblogs.com/makejeffer/p/4937054.html

3、https://blog.csdn.net/fishmai/article/details/63257662

着色:光照跟着色在3D图形专业领域占据了非常大的比重,并且有专门论述它们的书籍。另一方面,着色器(Shader)则是在图形硬件上执行的单独程序,用来处理顶点和执行光栅化任务。

纹理贴图(Texture Mapping):

更多文理贴图的概念:

1、https://blog.csdn.net/hudfang/article/details/50311523

2、http://www.cnblogs.com/bcfx/articles/2914377.html

混合:将不同的颜色混在一起。

将点连接起来:实心3D几何体无非就是将顶点间的点连接起来,然后对三角形进行光栅化而使对象变得有实体。

二、入门指南

2.1 什么是OpenGL

OpenGL严格来说是一种“图形硬件的软件接口”,从本质上说是一个3D图形和模型库,具有高度的可移植性,病具有很快的速度。OpenGL并不像C或C++那样的编程语言,更像是一个C运行时的函数库,提供了一些预先打包好的功能。OpenGL规范包含GLSL,即OpenGL着色语言,实际上是一种非常类似C语言的程序设计语言,GLSL不会对应用程序流程和逻辑进行控制,而是用于渲染操作。

OpenGL的版本历史和发展:http://blog.sina.com.cn/s/blog_5383588c0101m28z.html

2.2 使用OpenGL

OpenGL是一种过程性而非描述性的图形API。OpenGL并不包含任何窗口管理、用户交互或文件I/0的函数。

2.2.1 GLUT

glut是一个处理OpenGL程式的工具库,负责处理和底层操作系统的呼叫以及I/O。GLUT代表OpenGL应用工具包,英文全称为OpenGL Utility Toolkit,是一个和窗口系统无关的软件包,它由Mark Kilgard在SGI时写的。作为AUX库的功能更强大的替代品,用于隐藏不同窗口系统API的复杂性。GLUT是专为构建中小型OpenGL程序。虽然GLUT是适合学习OpenGL和开发简单的OpenGL应用程序。GLUT并不是一个功能全面的工具包所以大型应用程序需要复杂的用户界面最好使用本机窗口系统工具包。所以GLUT是简单的、容易的、小的。GLUT中有C,C + +(C一样),FORTRAN和Ada编程绑定。GLUT的源代码分布是移植到几乎所有的OpenGL实现和平台

GLUT包括了以下常见的功能:

定义以及控制视窗侦测并处理键盘及鼠标的事件以一个函数呼叫绘制某些常用的立体图形,例如长方体、球、以及犹他茶壶(实心或只有骨架,如glutWireTeapot())提供了简单选单列的实现。

GLUT是由Mark J. Kilgard在Silicon Graphics工作时所写,此人同时也是OpenGL Programming for the X Window System以及The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics两书的作者。

GLUT的两个主要目的是建立一个跨平台的函式库(事实上GLUT就是跨平台的),以及简化学习OpenGL的条件。透过GLUT编写OpenGL通常只需要增加几行额外GLUT的程式码,而且不需要知道每个不同操作系统处理视窗的API。

所有的GLUT函数都以glut作为开头,例如glutPostRedisplay()。

2.2.2 GLEW

OpenGL扩展库是个简单的工具,用于帮助C/C++开发者初始化扩展(OpenGL扩展功能)并书写可移植的应用程序。GLEW当前支持各种各样的操作系统,包含Windows,Linux,Darwin,Irix与Solaris。

 为了使事情更简单,GLEW被预先封装在了GLTools库中。实际上,GLTools库是基于GLEW库的。

2.2.3 GLTools

提供许多快捷方式和便捷的工具,GLTools包含了一个用于操作矩阵和向量的3D数学库,并依赖GLEW获取OpenGL3.3中用来产生和渲染一些简单3D对象的函数,以及对视觉平截头体、相机类和变换矩阵进行管理的函数的充分支持。

2.3 OpenGL API特性

数据类型:

OpenGL学习(一)——基础知识与概念一、图形技术与术语二、入门指南三、第一个程序

错误:

OpenGL学习(一)——基础知识与概念一、图形技术与术语二、入门指南三、第一个程序

OpenGL状态机:

参考 :https://www.cnblogs.com/Anita9002/p/4415239.html

三、第一个程序

#include <GLTools.h>
#include <GLShaderManager.h>
#include <GL/glut.h>

GLBatch triangleBatch;
GLShaderManager shaderManager;

void ChangeSize(int w, int h)
{
	glViewport(0,0,w,h);
}

void SetupRC()
{
	glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
	shaderManager.InitializeStockShaders();
	GLfloat vVerts[] = {	-0.5f, 0.0f, 0.0f,
				0.5f, 0.0f, 0.0f,
				0.0f, 0.5f, 0.0f, };
	triangleBatch.Begin(GL_TRIANGLES, 3);
	triangleBatch.CopyVertexData3f(vVerts);
	triangleBatch.End();
}

void RenderScene()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
	GLfloat vRed[] = {1.0f, 0.0f, 0.0f, 1.0f};
	shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
	triangleBatch.Draw();
	glutSwapBuffers();
}

int main(int argc, char *argv[])
{
	gltSetWorkingDirectory(argv[0]);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
	glutInitWindowSize(800,600);
	glutCreateWindow("Triangle");
	glutReshapeFunc(ChangeSize);
	glutDisplayFunc(RenderScene);
	GLenum err = glewInit();
	if(GLEW_OK != err){
		fprintf(stderr, "GLEW error:%s\n",glewGetErrorString(err));
		return 1;
	}
	SetupRC();
	glutMainLoop();
	return 0;
}
           

编译命令:

g++ triangle.cpp -o triangle -lglut -lGL -lGLU -lgltools -lGLEW
           

运行结果:

OpenGL学习(一)——基础知识与概念一、图形技术与术语二、入门指南三、第一个程序

继续阅读