图元

2018-03-22  本文已影响0人  轮回小飞飞

一、基础管线

OpenGL 中图元只不过是顶点的集合以预定义的方式结合在一起。
管线分为2个部分:上半部分是客户机端,下半部分是服务器端。
服务器和客户端是功能和运行上都是异步的,它们是各自独立的软件或硬件块。


二、着色器

渲染过程,必备的2个着色器“顶点着色器”和“片元着色器”。
上图的Vertex Shader(顶点着⾊色器器) 和 Fragment Shader(⽚片段着⾊色器器)。

三、3种向 OpenGL 着色器传递渲染数据的方法

3.1 属性

属性:就是对一个顶点都要作改变的数据元素。实际上,顶点位置本身就是一个属性。属性就可以浮点类型、整形、布尔类型。

3.2 Uniform 值

通过设置 Uniform 变量就紧接着发送一个图元批次命令。Uniform 变量实际上可以无限地使用,设置一个应用于整个表面的单个颜色值。还可以设置一个时间值。在每次渲染某种类型的顶点动画时修改它。

3.3 纹理

简单的说,纹理就是矩形的数据数组。例如颜色、亮度数据等,之所以复杂,是因为矩形纹理可以映射到非矩形的区域。

四、创建坐标系

GLFrustum frustum;
void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax);

五、透视投影

GLFrustum frustum;
void SetPerspective(float fFov, float fAspect, float fNear, float fFar);

透视投影会进行透视除法对距离观察者很远的对象进行缩放和收缩。在投影到屏幕之后,视景体背面与视景体正面的宽度测量标准不同。
上图所示: 平头截体(frustum)的几何体,它的观察方向是从金字塔的尖端到宽阔端。观察者的视点与金字塔的尖端拉开一定距离。

GLFrustum类通过setPerspective ⽅方法为我们构建⼀一个平截头体。
参数:
fFov:垂直⽅方向上的视场⻆角度
fAspect:窗⼝口的宽度与⾼高度的纵横⽐比
fNear:近裁剪⾯面距离
fFar:远裁剪⾯面距离
纵横⽐比 = 宽(w)/⾼高(h)

 CLFrustum::SetPerspective(float fFov,float fAspect,float fNear
,float fFar);

六、存储着色器

6.1 GLShaderManager 的初始化

  GLShaderManager shaderManager;
  shaderManager.InitializeStockShaders();
  shaderManager.UseStockShader(参数列表) // 使用      

6.2 GLShaderManager 属性

标识符 描述符
GLT_ATTRIBUTE_VERTEX 3分量(x,y,z)顶点位置
GLT_ATTRIBUTE_COLOR 4分量(r,g,b,a)颜色值
GLT_ATTRIBUTE_NORMAL 3分量(x,y,z)表面法线
GLT_ATTRIBUTE_TEXTUREO 第一对2分量(s,t)纹理坐标
GLT_ATTRIBUTE_TEXTURE1 第二对2分量(s,t)纹理坐标

存储着色器为每一个变量都使用一致的内部变量命名规则和相同的属性槽。

6.3 GLShaderManager 的 uniform 值

GLShaderManager::UserStockShader(GLeunm shader ...);

七、OpenGL 图元

点、线、线带、线环、三角形、三角形金字塔、三角形带、三角形扇

//修改点的大小
glPointSize(4.0f);
//设置点的大小范围,点和点之间的距离
GLfloat sizes[2] = {2.0f,4.0f};
GLfloat stepSize = 1.0f;
//获取点的大小范围和步长
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
glGetFloatv(GL_POINT_GRAULRITY,&stepSize);
//3.通过使用程序点大小模式设置点大小
glEnable(GL_PROGAM_POINT_SIZE);
//GLSL程序
gl_PointSize = 5.0f;

八、GLBatch 容器(帮助类)

void GLBatch::Begin(GLenum primitive, GLuint nVerts, GLuint nTextureUnits = 0);
void GLBatch::CopyNormalDataf(M3DVector3f *vNorms);
void GLBatch::CopyColorData4f(M3DVector4f *vColors);
void GLBatch::CopyTexCoordData2f(M3DVector2f *vTexCoords, GLuint uiTextureLayer);
上一篇下一篇

猜你喜欢

热点阅读