OpenGL入门 - 1
简单来说就是实现图形的底层渲染 A. 比如在游戏开发中,对于游戏场景/游戏人物的渲染 B. 比如在音视频开发中,对于视频解码后的数据渲染 C. 比如在地图引擎,对于地图上的数据渲染 D. 比如在动画中,实现动画的绘制 E. 比如在视频处理中,对于视频加上滤镜效果 OpenGL/OpenGL ES/Metal 在任何项目中解决问题的本质就是利用 GPU 芯片来高效渲染图形图像。 图形 API 是 ios 开发者唯一接近 GPU 的方式。 OpenGL 阶段: OpenGL ES 阶段: Metal 阶段: 固定管线/存储着⾊器 顶点数据是由CPU/GPU来处理? 顶点缓存区:区域(不在内存!->显卡显存中。) 片元着色器 像素着色器 片元函数 GPUImage [-1,1]标准化设备坐标系(NDC) 物体/世界/照相机空间->右手系 规范化设备坐标:左手系。 x,y,z => 0,1,2 注意OpenGL中坐标系 OpenGL中的物体,世界,照相机坐标系都属于右手坐标系,而规范化设备坐标系(NDC)属于左手坐标系。笼统的说OpenGL使用右手坐标系是不合适的 OpenGL希望每次顶点着色后,我们的可见顶点都为标准化设备坐标系 (Normalized Device Coordinate, NDC)。也就是说每个顶点的x,y,z都应该在-1到1之间,超出这个范围的顶点将是不可见的。 通常情况下我们会自己设定一个坐标系范围,之后再在顶点着色器中将这些坐标系变换为标准化设备坐标,然后这些标准化设备坐标传入光栅器(Rasterizer),将他们变换为屏幕上的二维坐标和像素。 将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分布进行的,也是类似于流水线那样。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系系统(Coordinate System)。将物体的坐标变到几个过渡坐标系(Intermediate Coordinate System)的优点在于 在这些特定的坐标系统中,一些操作或运算更加方便和容易,这一点很快就变得明显。对我们来说比较重要的总共有5个不同的坐标系统。 这是一个顶点在最终被转化为片段之前需要经历的所有不同的状态。为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是 模型(Model)、观察(View)、投影(Projection)三个矩阵。 物体顶点的起始坐标在局部空间(Local Space),这里称为局部坐标(Local Coordinate),他在之后在变成世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后转为屏幕坐标(Screen Coordinate) 的形式结束。 物体坐标系: 每个物体都有他独立的坐标系,当物理移动或者改变方向时。该物体相关联的坐标系将随之移动或改变方向。 物体坐标系是以物体本身而言,比如,我先向你发指令,”向前走一步“,是向你的物体坐标系发指令。我并不知道你会往哪个绝对的方向移动。比如说,当你开车的时候,有人会说向左转,有人会说向东。但是,向左转是物体坐标系的概念,而向东则是世界坐标系概念。 在某种情况下,我们可以理解物体坐标系为模型坐标系。因为模型顶点的坐标都是在模型坐标系中描述的。 照相机坐标系: 照相机坐标系是和观察者密切相关的坐标系。照相机坐标系和屏幕坐标系相似,差别在于照相机坐标系处于3D空间中,而屏幕坐标系在2D平面里。 为什么要引入惯性坐标系? 因为物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系转换到世界坐标系只需要平移。 OpenGL最终的渲染设备是2D的,我们需要将3D表示的场景转换为最终的2D形式,前面使用模型变换和视觉变换将物体坐标转到照相机坐标系后,需要进行投影变换,将坐标从照相机坐标系转换为裁剪坐标系,经过透视除法后,变换到规范化设备坐标系(NDC),最后进行视口变换后,3D坐标才变换到屏幕上的2D坐标,这个过程入下图: 在上面的图中, 注意,OpenGL只定义了裁剪坐标系、规范化设备坐标系、屏幕坐标系,而局部坐标系、世界坐标系、照相机坐标系都是为了方便用户设计而自定义的坐标系,他们的关系如下图: OpenGL 然后对裁剪坐标执行透视除法从而将他们变换到标准化设备坐标。 OpenGL 会使用glViewPort内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标关联一个屏幕上的点。这个过程称为视口变换 局部坐标系(模型坐标系)是为了方便构造模型而设立的坐标系,建立模型时我们无需关心最终对象显示在屏幕那个位置。 模型变换的主要目的是通过变换使得用顶点属性定义或者3d建模软件构造的模型,能够按照需要,通过缩小、平移等操作放置到场景中合适的位置, 通过模型变换后,物体放置在一个全局的世界坐标系中,世界坐标系是所有物体交互的一个公共坐标系 视变换是为了方便观察场景中物体而建立的坐标系,在这个坐标系中相机是个假设的概念,是为了便于计算而引入的。相机坐标系中的坐标,就是从相机的角度来解释世界坐标系中的位置 OpenGL中相机始终位于原点,指向 -Z轴,而以相反的方式来调整场景中物体,从而达到相同的观察效果。例如要观察-Z轴方向的一个立方体的右侧面,可以有两种方式: GLShaderManager的初始化 GLShaderManager shaderManager; shaderManager.InitializeStockShaders();
OpenGL简介
上一节已经搭建好了开发环境,在正式学习如何用OpenGL前,我们先了解一下OpenGL的基础知识。
一、OpenGL是什么
一般它被认为是一个API,包含了一系列的函数,用来操作各种图形图像。事实上并不是,OpenGL仅仅是一个由一个名为Khronos组织制定并维护的规范。但是,我宁愿把它当成是API来理解,因为规范严格规定了OpenGL各函数的输入和输出,内部细节都是开发者自行决定。那么以API来理解,我认为是很合理的。(其实OpenGL函数大多是各显卡厂商开发的,所以如果你在用OpenGL开发过程中如果遇到问题,可以尝试更新显卡驱动的方式来解决,当然,前提是你还要确定一下显卡厂商)
如果你想了解OpenGL规范细节,可以访问https://www.opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf。
二、状态机
OpenGL是一个状态机,无论是官方信息还是网络上的信息,都解释的比较繁琐和复杂。
我认为,可以这么理解,当我们用OpenGL去绘制一个三角形时,要把OpenGL当前状态设置成可以绘制三角形的状态,比如颜色、线条啥的,渲染就出来三角形了。如果又想绘制线段了,就把OpenGL当前状态再设置成线段的状态,就可以渲染出线段了。
说白了,就是想绘制啥,就把状态设置先设置成啥,这就是状态机。(这是我自己理解的,哈哈)
三、核心模式与立即渲染模式
OpenGL3.2之前,它都是立即渲染模式,3.2之后,它使用了核心模式,抛弃了立即渲染模式。
那么什么是立即渲染模式,什么是核心模式呢?
我查了网上很多资料,都没有把这个事情说清楚,我通过各种文章,是这么理解的:
立即渲染模式是类似这样:
glBegin( GL_TRIANGLES );
glVertex3f(-1.0f, -0.5f, -4.0f);
glVertex3f( 1.0f, -0.5f, -4.0f);
glVertex3f( 0.0f, 0.5f, -4.0f);
glEnd();
上面是绘制三角形的,具体可以不用追究。只要明白,设置好点,放在glBegin和glEnd之间,就能渲染出来三角形了。这就是立即渲染模式。
而核心模式就要关注细节了,它是如何用点和颜色渲染图形的,都需要开发者参与设计。
暂时我就理解到这个程度,后续边学边理解吧。
四、对象
OpenGL库是用C语言写的,我们知道C语言是面向过程的,之前的OpenGL也是面向过程的,比如,绘制一个图形,就要设置好顶点和颜色,如果再绘制一个,就要再设置一次。而OpenGL引入“对象(Object)”后,就方便多了。比如:
// 创建对象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);
上面这段是在网上抄过来的,不过,说明很详细,我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文(就是设置内容,比如颜色、大小等等)的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。
说白了,就是,创建一个对象,先用一个ID保存起来,并设置好内容,想用了,将这个ID跟设置目标(比如GL_WINDOW_TARGET)绑定,就可以用了,不用每次都重新设置。
好了,这次了解了一些OpenGL的基础,下一次就可以开心正式学习OpenGL了。
十大opengl教程
关于十大OpenGL教程如下:1.Learn OpenGL-OpenGL官方教程OpenGL官方网站提供了丰富的教程和文档,适合初学者入门和高级用户深入学习。这些教程涵盖了OpenGL的基本概念、渲染管线、着色器编程等内容,是学习OpenGL的重要资源。2.OpenGL Programming Guide(Red Book)《OpenGL编程指南》OpenGL编程指南是OpenGL的经典教材,被称为Red Book,内容详实,适合有一定编程基础的读者学习。书中介绍了OpenGL的基本概念、图形绘制、变换、光照等内容,并提供了大量实例和代码。3.OpenGL SuperBible《OpenGL超级宝典》OpenGL超级宝典是一本权威的OpenGL教程,适合初学者和有一定经验的读者。书中详细介绍了OpenGL的基本原理、渲染技术和高级特效,是学习OpenGL进阶的好资料。4.OpenGL Insights《OpenGL洞察》OpenGL洞察是一本深入研究OpenGL技术和应用的书籍,由多位OpenGL专家撰写。书中涵盖了OpenGL的高级技术和最佳实践,对于深入了解OpenGL的内部原理和优化非常有帮助。5.OpenGL Shading Language(Orange Book)《OpenGL着色器语言》OpenGL着色器语言是一本关于GLSL(OpenGL着色器语言)的教程,适合学习OpenGL着色器编程。书中介绍了GLSL的语法、语义和使用方法,并提供了大量实例和应用场景。
求《OpenGL超级宝典第5版》全文免费下载百度网盘资源,谢谢~
《OpenGL超级宝典第5版》百度网盘pdf最新全集下载:链接:https://pan.baidu.com/s/1J0F2fnO38VUvi9xpJrwemw?pwd=ownj 提取码:ownj简介:《OpenGL超级宝典(第5版)》是OpenGL及3D图形编程的入门指南,涵盖了使用版本的OpenGL进行编程所需要的主要知识。全书分三部分,共16章,另有3个附录。部分包括第1章到第7章,介绍如何构建一个使用OpenGL的程序、如何设置3D渲染环境,以及如何创建基本对象和光线并对他们进行着色。然后深入研究如何使用OpenGL,并向读者介绍GLSL,以及如何创建自己的着色器。第二部分包括第8章到第12章,将进行更深入的研究,而懂得如何应用这些高级特性将使读者业余3D玩家的水平。这一部分不仅能够使我们掌握更多的可视化效果,同时也考虑了性能表现。第三部分包括第13章到第16章,着重介绍OpenGL如何支持和连接Windows、MacOSX、Linux和掌上设备。附录部分给出了更多阅读建议、术语表和API参考介绍。《OpenGL超级宝典(第5版)》适合希望精通OpenGL以便对图形编程和3D图形知识进行扩展的程序员阅读,也可以帮助经验丰富的OpenGL程序员学习如何移植自己的应用程序。本书既可以作为学习OpenGL的教材,也可以作为随时查阅的参考手册。
OpenGL编程指南的内容简介
《OPENGL编程指南》(原书第6版)在第5版的基础上进行了全面修订,涵盖了OpenGL2.1版本的最新特性。《OPENGL编程指南》以清晰的语言、丰富的实例以及翔实的内容描述了OpenGL的功能以及许多计算机图形技巧。全书共15章,包括OpengGL简介、状态管理和绘制几何物体、视图、颜色、光照、混合、抗锯齿、雾、多边形偏移、显示列表、绘制像素、位图、字体、图像、纹理贴图、帧缓冲区、分格化和二次方程表面、求值器和NURBS、选择和反馈、OpenGL高级技巧以及OpenGL着色语言等内容。《OPENGL编程指南》对OpenGL以及OpenGL实用函数库提供了全面而又权威的介绍,素有“OpenGL红宝书”之美誉。
OPENGL如何改变窗口大小保持图形的纵横比,原理是什么?
问题的关键在于设置裁剪区域的纵横比与视口的纵横比一致。设置视口大小:[cpp] view plain copyglViewport(GLint x,GLint y,GLsizei w,GLsizei h); (x,y)是视口距离窗口左下角的位置,(w,h)是视口的宽度和高度。设置二维观察函数:[cpp] view plain copyglOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GL double top); 锁定纵横比,注意这里为什么要加一个判断语句。比如当窗口的宽大于高时(w>h),裁剪区域只能设置将高扩大即:(-15.0/ratio,15.0/ratio),而不能设置将宽缩小(这样会使图像在w方向的部分显示不出来)[html] view plain copyglViewport(0,0,w,h); GLfloat ratio=(GLfloat)w/(GLfloat)h; if(w<=h)//保持形状不变 gluOrtho2D(-15.0,15.0,-15.0/ratio,15.0/ratio); else gluOrtho2D(-15.0*ratio,15.0*ratio,-15.0,15.0); 具体代码:[cpp] view plain copy#include #include GLfloat v[3][3]={{-10.0,0.0,0.0},{10.0,0.0,0.0},{0.0,10.0,0.0}}; int num=5; void reshape(GLsizei w,GLsizei h) { GLfloat ratio=(GLfloat)w/(GLfloat)h; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h)//保持形状不变 gluOrtho2D(-15.0,15.0,-15.0/ratio,15.0/ratio); else gluOrtho2D(-15.0*ratio,15.0*ratio,-15.0,15.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void triangle(GLfloat* a,GLfloat* b,GLfloat* c) { glVertex3fv(a); glVertex3fv(b); glVertex3fv(c); } void divide_triangle(GLfloat* a,GLfloat* b,GLfloat* c,int n) { GLfloat ab[3],ac[3],bc[3]; if(n>0) { for(int j=0;j<3;j++) { ab[j]=(a[j]+b[j])/2; ac[j]=(a[j]+c[j])/2; bc[j]=(b[j]+c[j])/2; } divide_triangle(a,ab,ac,n-1); divide_triangle(ab,b,bc,n-1); divide_triangle(ac,bc,c,n-1); } else triangle(a,b,c); } void display() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); divide_triangle(v[0],v[1],v[2],num); glEnd(); glFlush(); } void myInit() { glClearColor(1.0,1.0,1.0,1.0); glColor3f(0.0,1.0,0.0); glViewport(0,0,500,500); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-15.0,15.0,-15.0,15.0); glMatrixMode(GL_MODELVIEW); } void main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(0,0); glutCreateWindow("Sierpinski"); glutReshapeFunc(reshape); glutDisplayFunc(display); myInit(); glutMainLoop(); } 视口和视景体,当视口的纵横比和视景体的纵横比相同的时候,改变窗口大小,图像才不会变形;例如:控制视口大小为:glViewprot(0,0,400,200);则其纵横比为2那么控制视景体的参数为:gluPerspective(fovy,2,near,far);可以了控制视景体还有其他函数,原理是一样的opengl编程指南有详细解释。
OpenGL超级宝典的介绍
《OpenGL超级宝典(第4版)》是OpenGL及3D图形编程最好的入门指南,涵盖了使用最新版本的OpenGL进行编程所需要的主要知识。全书分3个部分,共22章,另有3个附录。第一部分包括第1章到第14章,介绍如何构建一个使用OpenGL的程序,如何设置3D渲染环境,以及如何创建基本对象和光线并对他们进行着色。然后,深入研究使用OpenGL和它的一些高级特性及不同的特殊效果。第二部分包括第15章到第18章,分别介绍了OpenGL中支持可编程硬件[特别是在OpenGL着色语言(GLSL)中]的新特性。第三部分是第19章到第22章,着重介绍OpenGL是如何支持和连接Windows、Mac OS X、Linux和掌上设备。附录部分给出了更多阅读建议、术语表和API参考介绍。