OpenGL chapter3 基础渲染
3.1 基础图形管线
三种向OpenGl着色器传递渲染数据的方法:属性,Uniform和纹理.
3.2 创建坐标系
3.2.1 正投影
GLFrustum::SetOrthographic(⋯⋯);
3.2.2 透视投影
GLFrustum::SetPerspective(float fFov, float fAspect, float fNear, float fFar);
3.3 使用存储着色器
GLShaderManager 在使用前必须进行初始化
shaderManager.InitializeStockShaders();
3.3.1 属性
GLShaderManager预定义的标识符
GLT_ATTRIBUTE_VERTEX 3分量(x, y, z)顶点位置
GLT_ATTRIBUTE_COLOR
GLT_ATTRIBUTE_NORMAL
GLT_ATTRIBUTE_TEXTURE0
GLT_ATTRIBUTE_TEXTURE1
3.3.2 Uniform值
单位(Identity)着色器:
平面作色器:
上色(Shaded)着色器:
默认光源着色器:
点光源着色器:
纹理替换矩阵:
纹理调整着色器:
纹理光源着色器:
3.4 将点连接起来
3.4.1 点和线
GL_POINTS
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
点:
void glPointSize(GLfloat size); //默认大小为一个像素
GLfloat size[2];
GLfloat step;
//获支持的点大小范围和步长
glGetFloatv(GL_POINT_SIZE_RANGE,size);
glGetGloatv(GL_POINT_SIZE_GRANULARITY,&step);
线:
void glLineWidth(GLfloat width); //默认宽度一个像素,改变线段宽度的唯一方式是使用该函数
3.4.2 绘制三角形
在默认情况下。OpenGL认为具有逆时针方向环绕的多边形是正面的。
glFrontFace(GL_CW);
GL_CW : 告诉openGL顺时针环绕多边形被认为是正面的,GL_CCW 可以恢复为逆时针
3.4.4 一个简单批次容器
GLTools库中包含一个简单的容器类,叫做GBatch.
//首先对批次进行初始化,告诉这个类代表那种图元,定点数,以及一组或者两组纹理坐标
void GLBatch::Begin(GLenum primitive, GLuint nVerts, GLuint nTextureUints = 0);
//然后 至少要辅助一个由3分量(x,y,z)定点组成的数组
void GLBatch::CopyVertexData3f(GLfloat *vVerts);
//我们还可以选择复制表面法线,颜色和纹理坐标
void GLBatch::CopyNormalDataf(GLfloat *vNorms);
void GLBatch::CopyColorData4f(GLfloat *vColors);
void GLBatch::CopyTexCoordData2f(GLfloat *vTexCoords, GLuint uiTextureLayer);
void GLBatch::End(void);
//example
GLBatch triangleBatch;
//Load up a triangle
GLfloat vVerts[] = {-0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f };
triangleBatch.Begin(GL_TRIANGLES,3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
//Render
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
triangleBatch.Draw();
正面和背面剔除
glEnable(GL_CULL_FACE);
glDisable(GL_CULL_FACE);
注意:我们并没有指明剔除正面还是背面,这个是由glCullFace控制的。
void glCullFace(GLenum mode);
// mode : GL_FRONT GL_BACK 或者 GL_FRONT_AND_BACK
//example 消除不透明物体内部几何图形就需要两行代码
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE_);
深度测试:
是另外一种高效消除隐藏表面的技术,那么我们在使用GLUT设置OpenGL窗口的时候,应该请求一个深度缓冲。例如,我们可以按照如下方式申请一个颜色缓冲区和一个深度缓冲。
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
//启用深度测试
glEnable(GL_DEPTH_TEST);
多边形模式:
void glPolygonMode(GLenum face, GLenum mode); //允许将多边形渲染成实体,轮廓或只有点
face: GL_FRONT GL_BACK 或 GL_FRONT_AND_BACK
mode: GL_FILL (default),GL_LINE, GL_POINT
//example 将多边形正面和背面绘制为线框模式
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
3.4.6 多边形偏移
void glPolygonOffset(GLfloat factor, GLfloat units);
应用到片段上的总偏移可以通过下面的方程式表示:
Depth Offset = (DZ x factor) + ( r x units);
⋯⋯⋯⋯⋯⋯⋯⋯
3.4.7 裁剪
另外一种提高渲染性能的方式是只刷新屏幕上发生变化的部分。
//开启裁剪测试
glEnable(GL_SCISSOR_TEST);
//close
glDisable(GL_SCISSOR_TEST);
void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
其中 x y 参数指定了裁剪框的左上角。
3.5 混合
glEnable(GL_BLEND);
3.5.1 组合颜色
目标颜色: 已经存储在颜色缓冲区中的颜色值。
源颜色: 作为当前渲染命令的结果进入颜色缓冲区的颜色值
当混合功能被开启时,源颜色和目标颜色的组合方式是由混合方程式控制的。在默认情况下,混合方程是如下所示。
Cf = (Cs * S ) + ( Cd * D)
S 源混合因子
D 目标混合因子
glBlendFunc(GLenum S, GLenum D);
3.5.2 改变混合方程式
3.5.3 抗锯齿
//开启抗锯齿功能非常简单。首先,我们必须启动混合功能,并且像前一节实现透明一样设置混合函数
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//我们还需要确保吧混合方程式设置为GL_ADD,不过由于这是默认的设置。所以我们就不在这里显示这个步骤了。在启用混合功能并且选择正确的混合函数以及混合方程式之后,我们可以调用
glEnable函数对点,直线或多边形(任何实心图元)进行抗锯齿处理。
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
3.5.4 多重采样
例如,为了请求一个多重采样,完全颜色,带深度的双缓冲帧缓冲区,我们可以调用
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);
可以使用glEnable/glDisable组合打开或关闭多重采样:
glEnable(GL_MULTISAMPLE);
或
glDisable(GL_MULTISAMPLE);
OpenGL chapter3 基础渲染的更多相关文章
- 通过OpenGL理解前端渲染原理(1)
一.OpenGL OpenGL,是一套绘制3D图形的API,当然它也可以用来绘制2D的物体.OpenGL有一大套可以用来操作模型和图片的函数,通常编写OpenGL库的人是显卡的制造者.我们买的显卡都支 ...
- OpenGL基础渲染
客户端-服务器 客户端是存储在CPU存储器中的,并且在应用程序中执行(或者驱动程序),驱动程序将渲染命令和数据组合起来,发动到服务器执行.服务器和客户机在功能上是异步的,他们是各自独立的软件模块或者硬 ...
- OpenGL超级宝典第5版&&基础渲染
1.OpenGL查询拓展机制是否被支持 gltools函数库: int gltIsExtSupported(const char *extension) { #ifndef OPENGL_ES GLi ...
- OpenGL chapter5 基础纹理
Chapter5 基础纹理 Contents: ==================================================== | 任务 | 使用的函数 ========== ...
- opengl离屏渲染(不需要和窗口绑定,仅当作一个可以渲染一张图片的API使用)+ opencv显示
具体过程参考的是这篇BLOG: http://wiki.woodpecker.org.cn/moin/lilin/swig-glBmpContext 这一片BLOG的代码有个 BOOL SaveBmp ...
- OpenGL中的渲染方式—— GL_TRIANGLE_STRIP
OpenGL值绘制三角形的方式常用的有三种,分别是GL_TRIANGLES.GL_TRIANGLE_STRIP.GL_TRIANGLE_FAN,其效果如依次是: 从左起:第一个方式是GL_TRIANG ...
- OpenGL chapter4 基础变换
math3d库有两个数据类型,能够表示一个三维或四维向量: M3DVector3f M3DVector4f 4.3 理解投影 正投影 : 正交变换 透视投影 : 透视变换 表4.1 OpenGL变换术 ...
- 04: OpenGL ES 基础教程03 纹理
前言 1:常用类: 1:纹理的作用 正文 一:常用类 上下文 顶点数据缓存 着色器 baseEffect 一:纹理 1.1: 纹理可以控制渲染的每个像素的颜色. 1.2: 纹素:与像素一样,保存每 ...
- 还在使用OpenGL ES做渲染,你Out了,赶紧来拥抱Vulkan吧~
背景介绍 Vulkan是Khronos组织制定的"下一代"开放的图形显示API.是与DirectX12能够匹敌的GPU API标准. Vulkan是基于AMD的Mantle API ...
随机推荐
- View的事件拦截机制浅析
为什么要去分析view的事件 记得上周刚立的flag就是关于view的事件机制.那现在我来说说我对view的感受.关于view的事件,百度google一搜.一批又一批.但是能让人理解的少之又少.换句话 ...
- Use JAWS 14 in a VM
We were not able to run the JAWS 14 app in a Virtual Machine after the installation is completed, th ...
- Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)
我在之前的博客中有教大家如何编写 NuGet 工具包,其中就有编写 .targets 文件. 我在实际的使用中,发现 Visual Studio 2017 带来的含 Sdk 的新 csproj 格式基 ...
- Spring学习--静态工厂方法、实例工厂方法创建 Bean
通过调用静态工厂方法创建 bean: 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节. 要声明 ...
- 【spring data jpa】好文储备
[spring data jpa]带有条件的查询后分页和不带条件查询后分页实现 : https://blog.csdn.net/lihuapiao/article/details/48782843 ...
- 为什么要用MQ
现在公司系统在做微服务化,很多人在设计服务间通信时都会想到用MQ,然而有些人居然说不清楚为啥要用MQ? 其实用它主要是两点考虑: 1.应用解耦:两个服务间通过MQ通信,可以不用完全知道对方的存在,实现 ...
- SPA页面缓存再优化二
部署到线上的步骤: 拿到打包之后的文件,删除服务器上的文件,再放上去的. 测试1: 更改js文件,删除并上传新包. 额外发现1:如果用户在上传期间,仍然在系统之内,此时即使将服务器上的包删除掉,用户不 ...
- 查看Linq to Sql生成的sql语句(转)
查看Linq to Sql生成的sql语句 在控制台项目中,比较简单,直接db.Log = Console.Out;就OK了 但是在其他项目中,需要处理如下: StreamWriter sw = ...
- Tomcat 8.5 无法进入Manage APP
解决的方法 1. 添加 Context http://stackoverflow.com/questions/36703856/access-tomcat-manager-app-from-diffe ...
- hadoop大数据处理平台与案例
大数据可以说是从搜索引擎诞生之处就有了,我们熟悉的搜索引擎,如百度搜索引擎.360搜索引擎等可以说是大数据技处理技术的最早的也是比较基础的一种应用.大概在2015年大数据都还不是非常火爆,2015年可 ...