天天看點

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學習(一)——基礎知識與概念一、圖形技術與術語二、入門指南三、第一個程式

繼續閱讀