LearnOpenGL03:Hello Triangle

在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。这个教程里,我们会简单地讨论一下图形渲染管线,以及如何利用它创建一些漂亮的像素。

1、 顶点数据(以三角形为例)
首先,我们以数组的形式传递3个3D坐标作为图形渲染管线的输入,用来表示一个三角形,这个数组叫做顶点数据(Vertex Data)。顶点数据是一系列顶点的集合。
一个顶点(Vertex)是一个3D坐标的数据的集合。
而顶点数据是用顶点属性(Vertex Attribute)表示的,它可以包含任何我们想用的数据。
简单起见,我们假定每个顶点只由一个3D(位置)和一些颜色值组成的。

当我们谈论一个“位置”的时候,它代表在一个“空间”中所处地点的这个特殊属性;同时“空间”代表着任何一种坐标系,比如x、y、z三维坐标系,x、y二维坐标系,或者一条直线上的x和y的线性关系,只不过二维坐标系是一个扁扁的平面空间,而一条直线是一个很瘦的长长的空间。
2、图形渲染管线的第一个部分是顶点着色器(Vertex Shader),它把一个单独的顶点作为输入。
顶点着色器主要的目的是把3D坐标转为另一种3D坐标(比如坐标系统变换等等),同时在顶点着色器中,我们可以对顶点属性进行一些基本处理。
3、图元装配(Primitive Assembly)阶段将顶点着色器输出的所有顶点作为输入(如果是GL_TRIANGLES,那么就是一个三角形),OpenGL把所有的点装配成指定图元的形状,本节例子中是一个三角形。
注:为了让OpenGL知道我们的坐标和颜色值构成的到底是什么,我们需要去指定这些数据所表示的渲染类型。
因此我们会做出提示,告诉它我们是希望把这些数据渲染成一系列的点/一系列的三角形/一个长长的线……做出的这些提示叫做图元(Primitive),任何一个绘制指令的调用都将把图元传递给OpenGL。
这是其中的几个图元:GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。
4、图元装配阶段的输出会传递给几何着色器(Geometry Shader)。几何着色器把图元形式的一系列顶点的集合作为输入。
它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。例子中,它生成了另一个三角形。
5、几何着色器的输出会被传入光栅化阶段(Rasterization Stage),这里它会把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)——OpenGL中的一个片段是指OpenGL渲染一个像素所需的所有数据。
在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。
6、片段着色器主要是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。
通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。
7、最后一个阶段,我们叫做Alpha测试和混合(Blending)阶段。
这个阶段检测片段的对应的深度(和模板(Stencil))值,用来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。
这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。

【西川善司】3D图形的概念和渲染管线(1) http://imgtec.eetrend.com/d6-imgtec/blog/2014-08/3077.html

VBO建立

然后我们要造一个VBO,绑在ARRAY_BUFFER的位置上

unsigned int VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER,VBO);

glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数。

它的第一个参数是目标缓冲的类型:顶点缓冲对象的话是当前绑定到GL_ARRAY_BUFFER的目标上。
第二个参数指定传输数据的大小(以字节为单位);用一个简单的sizeof计算出顶点数据大小就行。
第三个参数是我们希望发送的实际数据。
第四个参数指定了我们希望显卡如何管理给定的数据。它有三种形式:
GL_STATIC_DRAW :数据不会或几乎不会改变。
GL_DYNAMIC_DRAW:数据会被改变很多。
GL_STREAM_DRAW :数据每次绘制时都会改变。
 

Shader

这节课不深入到shader内容,直接copy教程代码

const char* vertexShaderSource =
"#version 330 core									   \n"
"layout(location = 0) in vec3 aPos;					   \n"
"void main(){										   \n"
"	gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值