OpenGL 学习笔记(二) 基础渲染

(一)渲染底层实现

1.OpenGL API 将接收到的渲染数据(纹理数据,uniforms,属性)传递给顶点着色器,顶点着色器为每个顶点计算光照效果,位移,颜色等。

2.顶点着色器再将数据传入图元组合(Primiive Assembly),将顶点组合起来,并进行光栅化。       光栅化:简单来说就是将一个几何图形变成二维片元的过程。

3.最后将数据传入片段着色器,对每个片元做最后的填充,形成最终图形。

(二)创建基础坐标系

  1.正投影坐标系

GLFrustum::SetOrthographic(GLfloat xMin,GLfloat xMax,GLfloat yMin,GLfloat yMax,GLfloat zMin,GLfloat zMax);                                                                                                                        此坐标系 x,y,z 三轴最大范围 都为 -100—100,指定了范围外的区域将会被裁掉。

  2.透视投影坐标系

GLFrustum::SetPerspective(GLfloat fFovy,GLfloat fAspect,GLfloat fNear,GLfloat fFar);

 OpenGL 学习笔记(二) 基础渲染_第1张图片

 参数分别是垂直方向视场角度,w与h纵横比,远近距离。

(三)使用存储着色器

1.在渲染前必须定义存储着色器,定义如下:

GLShaderManager shaderManager();  //定义

shaderManager.InitializeStockShaders();   //初始化

 2.使用不同的着色器

(1)单位着色器

GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);                        使用默认的笛卡尔坐标系,所有片段都应用一种颜色,几何图形为实心和为渲染的。

(2)平面着色器

GLShaderManager::UseStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);   允许为几何图形变换指定一个4*4的变换矩阵

先介绍俩种 其他的接下来用到再讲。

(四)绘制点线

OpenGL 学习笔记(二) 基础渲染_第2张图片

 1.点

改变默认点的大小 void glPointSize(GLfloat size);                                                                            还可以使用程序点大小模式来设置点大小

glEnable(GL_PROGRAM_POINT_SIZE);  gl_PointSize=5.0;

现在来绘制点

GLBatch   pointBatch;  //在程序头定义点批次容器

pointBatch.Begin(GL_POINTS, 24);  //24 是我定义24个点
pointBatch.CopyVertexData3f(vCoast);   //复制坐标点

pointBatch.End();

接下来 在RenderScene 函数中,我们选择适当的存储这色器并调用draw 函数

glPointSize(4.0f);

shaderManager.UseStockShader(GLT_SHADER_IDENTITY , vBlack);

pointBatch.Draw();
 OpenGL 学习笔记(二) 基础渲染_第3张图片

 

2.线

改变线宽 void glLineWidth(GLfloat width);绘制方式与点一致 唯一修改 lineBatch.Begin(GL_LINES, 24);

 

OpenGL 学习笔记(二) 基础渲染_第4张图片

 3D图形的绘制在以后会慢慢介绍

 (五)渲染可能出现的问题解决

1.正面和背面的剔除

这种问题

OpenGL 学习笔记(二) 基础渲染_第5张图片

 

glCullFace(GL_BACK); //GL_FRONT,GL_FRONT_AND_BACK

glEnable(GL_CULL_FACE);

2.深度测试

解决类似问题

OpenGL 学习笔记(二) 基础渲染_第6张图片

 glEnable(GL_DEPTH_TEST); //再次之前必须先申请深度缓冲区

 

(六)混合

1.打开混合功能 glEnable(GL_BLEND);

2.设置混合函数 glBlendFunc(GLenum S,GLenum D);

(七) 抗锯齿

glEnable(GL_POINT_SMOOTH);

glEnable(GL_LINE_SMOOTH);

glEnable(GL_POLYGON_SMOOTH);

必须先开启混合功能

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(opengl,学习)