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 ...
随机推荐
- WebGL编程指南案例解析之平移和旋转的math库实现
这里说的math库实现,指的是,通过一般的加减乘除(角度计算)来更新坐标值. 因为涉及到坐标的变化,所以这里都是基于对顶点着色器的修改 平移: var vShader = ` attribute ve ...
- SWIFT中切換UIContainerView內的Controller
如下,一个UIContainerView内切换两个Controller,当点击登录的时候UIContainerView的视图为LoginController,当点击登记的时候UIContainerVi ...
- SWIFT中计算两个日期间隔多少小时
SWIFT中如何计算两个日期间隔多少个小时,其实几句代码就可以搞定了,Very Easy,在Playground内输入以下代码 var date1 = "2015-06-26 8:15:10 ...
- OC基础:内存(内存管理) 分类: ios学习 OC 2015-06-25 16:50 73人阅读 评论(0) 收藏
自动释放池: @autoreleasepool { } 内存管理机制 谁污染,谁治理 垃圾回收机制:gc(Garbage collection),由系统管理内存,开发人员不需要管理. OC ...
- 手机连不上eclipse
在进行android开发时,有时候会很奇怪,手机连不上eclipse了,打开eclipse的ddms也没有,重启adb也不行,这时候我们应该怎么办呢. 首先打开资源管理器,找到 adb.exe 结束掉 ...
- OpenCV Error: Insufficient memory问题解析
前言 项目程序运行两个月之久之后突然挂了,出现OpenCV Error: Insufficient memory的错误,在此分析一下该问题. 问题的表现形式: 程序内存使用情况: 问题: OpenCV ...
- cloneNode
- 20155216 2016-2017-2 《Java程序设计》第五周学习总结
20155216 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 使用try,catch,finally处理异常 JVM会尝试执行try区块中的程序代码,如果 ...
- bulid-tool
Build tool 中文构建工具.构建工具能够帮助你创建一个可重复的.可靠的.携带的且不需要手动干预的构建.构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求.假设你想要编译 ...
- POJ2311 Cutting Game
题意 Language:Default Cutting Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6007 Acc ...