opengl回顾(二)

在一的基础上绘制一个三角形

理论:

opengl使用图形渲染管线来把2D坐标转换成3D坐标,他可以分为两部分:一是把3D坐标转换到屏幕的2D坐标,二是为这些2D坐标转变成有颜色的像素。

图形渲染管线接受一组3D坐标,将其转换成屏幕上的2D像素,其中经过这样几个阶段

3D顶点坐标输入->顶点着色器->形状图元装配->几何着色器->光栅化->片段着色器->混合与测试

1、顶点着色器:将输入的3D坐标转换成另一种3D坐标来给下个阶段使用

2、形状图元装配,将顶点着色器处理的3D坐标装配成指定的形状(比如三角形),然后输出给几何着色器

3、几何着色器,几何着色器可以为装配好的图元加上额外的顶点来构建新的图元,然后进行光栅化

4、光栅化,将图元映射为最终的屏幕上的像素,进过裁切后交给片段着色器

5、片段着色器,对留下的像素颜色进行处理的地方我们很多的效果便在这里实现(比如锐化),这里得到的颜色便是像素最终的颜色之后进入混合与测试

6、混合与测试又称alpha测试与混合,alpha即像素透明度,混合即把像素按照不同的透明关系混合;深度测试则是测试3D空间中物体的遮挡关系,决定最后剩下的哪些像素应该显示在前,哪些被遮挡舍弃;模板测试决定3D空间中物体那些部分应当显示(由程序员决定的)哪些被剔除。

 

在渲染一个三角形时我们首先会需要一组顶点坐标

float vertices[] = {
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
     0.0f,  0.5f, 0.0f
};

由x/y/z坐标确定一个点的空间位置,三个点确定一个三角。此处所有顶点的Z坐标为0.0,故它们之间不存在遮挡关系。

 

 

 

接着我们会需要一个顶点缓冲VBO

顶点着色器会将上面的3D坐标转化为 “标准化设备坐标” ,标准化坐标系是一个2维坐标系,x,y轴的值被限定在(-1,1)内,故我们之前的三角的坐标均未超过(-1,1)的范畴。

“标准化设备坐标”之后会被转化成“屏幕空间坐标”,这通过 “视口变换” 来完成,也就是上一篇使用的glViewPort(width,height,null.null);

即把x(-1,1);y(-1,1)范围内的坐标转换到x(0,width);y(0,height)的范围里。之后的 “屏幕空间坐标” 再传递给片段着色器。

但首先,我们得把顶点数据发送到顶点着色器。

此时我们会需要:顶点缓冲对象VBO。

opengl采用的是c语言,我们首先用unsigned int创建一个VBO。

再使用glGenBuffers(1,VBO);来生成一个VBO“对象”。

再通过glBindBuffer(GL_ARRAY_BUFFER,VBO);告知我们当前使用的顶点缓冲为VBO。

最后用glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);来把顶点数据绑定到当前的顶点缓冲(GL_ARRAY_BUFFER意味着我们是为顶点缓冲绑定)也就是VBO上。

完整代码如下:

unsigned int VBO;
glGenBuffers(1,VBO);
//生成数量    要生成的缓冲对象
glBindBuffer(GL_ARRAY_BUFFER,VBO);
//缓冲类型     缓冲对象
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
//缓冲类型    缓冲数据大小        实际缓冲数据指针        管理缓冲数据的方式

此时VBO就已经拥有了顶点数据,特别提一下glBufferData中的GL_STATIC_DRAW,这个函数的第四个参数决定的是

“我们希望显卡管理缓冲数据的方式”

GL_STATIC_DRAW         几乎不改变顶点数据

GL_DYNAMIC_DRAW     顶点数据经常改变

GL_STREAM_DRAW      顶点数据每次绘制都改变

介于我们的这个三角不会改变顶点故选择GL_STATIC_DRAW

 

 

 

链接顶点数据

拥有顶点缓冲后我们需要告知opengl如何解析这些数据,但首先我们看看顶点缓冲中的数据应当怎么解析。

float vertices[] = { -0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f, 0.0f,  0.5f, 0.0f };

如上所示,所有的数据连续排列ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值