众所周知,Kanzi自身所具备的强大引擎功能,能轻松实现3D元素渲染效果。如下图车模,用户可以在Kanzi Studio中快速完成图中车模的渲染。
那Kanzi又是如何做到的呢?这里向大家介绍一下实现3D渲染效果的两个重要基本原理:
图像渲染技术OpenGL ES工作原理
光照基本原理

01
在 OpenGL ES 版本中,1.0 版本支持固定管线,而 2.0 版本不再支持固定管线,只支持可编程管线。什么是管线?什么又是固定管线和可编程管线?管线(Pipeline)也称渲染管线,由于OpenGL ES在渲染处理过程中会顺序执行一系列操作,这一系列相关操作的处理阶段就被称为OpenGL ES渲染管线。Pipeline 来源于福特汽车生产车间的流水线作业,在OpenGL ES渲染过程中也是一样,一个操作接着一个操作进行,就如流水线作业一样,这样的实现极大地提供了渲染的效率。整个渲染管线如下图所示:

图中阴影部分的 Vertex Shader和Fragment Shader是可编程管线。可编程管线就是说这个操作可以动态编程实现而不必固定写死在代码中。可动态编程实现这一功能一般都是脚本提供的,在OpenGL ES中,编写这些脚本的能力是由着色语言(Shader Language)提供的。那可编程管线有什么好处呢?它可以方便我们动态修改渲染过程,且无需重写编译代码。当然也和很多脚本语言一样,Shader Language调试起来不太方便。
再回到上图,这张图就是OpenGL ES的“架构图”,学习OpenGL ES就是学习这张图中的每一个部分,在这里先粗略地介绍一下:
1.Vertex Array/Buffer Objects:
顶点数据来源,这时渲染管线的顶点输入,通常使用Buffer Objects效率更好。在今天的示例中,简单起见,使用的是Vertex Array;
2.VertexShader:
顶点着色器通过可编程的方式实现对顶点的操作,如进行坐标空间转换,顶点处理所做的工作则是:
1) 顶点变换根据模型视图和投影矩阵变换
2) 光照计算法线变换(法线矩阵是模型矩阵的左上角3*3的逆矩阵)和法线规格化
3) 纹理坐标变换(纹理矩阵)
4) 材质状态纹理坐标生成
顶点处理最重要的则是变换和光照,每个顶点在这个阶段是分别被单独处理的。
这个阶段所接收到的数据则是每个顶点的属性特征...输出则是变换后的顶点数据。
3.Primitive Assembly:图元装配,经过着色器处理之后的顶点在图片装配阶段被装配为基本图元。OpenGL ES支持三种基本图元:点,线和三角形。接着对装配好的图元进行裁(Clip):保留完全在视锥体中的图元,丢弃完全不在视锥体中的图元,对一半在一半不在的图元进行裁剪;接着再对在视锥体中的图元进行剔除处理(Cull):这个过程可通过编码来决定剔除正面还是背面或者全部剔除。在经过裁剪和剔除之后,即进入Geometry Shader(如果存在)或者光栅化处理阶段。
4.Rasterization:光栅化就是对所有的经过Primitive Assembly图元转换成屏幕上可以显示的二维Fragment。在光栅化阶段,基本图元被转换为二维的片元(Fragment),Fragment 表示可以被渲染到屏幕上的像素,它包含位置,颜色,纹理坐标等信息,这些值是由图元的顶点信息进行插值计算得到的。这些片元接着被送到片元着色器中处理。这是从顶点数据到可渲染在显示设备上的像素的一个质变的过程。
5.Fragment Shader:片元着色器通过可编程的方式实现对片元的操作。在这一阶段它接受光栅化处理之后的Fragment,Color,深度值,模版值作为输入。
6.Per-Fragment Operation:在这一阶段对片元着色器输出的每一个片元进行一系列测试与处理,从而决定最终用于渲染的像素。这一系列处理过程如下:

1) Pixel Ownership Test:该测试决定像素在Framebuffer中的位置是否为当前OpenGL ES所有。也就是说测试某个像素是否对用户可见或者被重叠窗口所阻挡;
2) Scissor Test:剪裁测试,判断像素是否在由glScissor定义的剪裁矩形内,不在该剪裁区域内的像素就会被剪裁掉;
3) Stencil Test:模版测试,将模版缓存中的值与一个参考值进行比从而进行相应的处理;
4) Depth Test:深度测试,比较下一个片段与帧缓冲区中的片段的深度,从而决定哪一个像素在前面,哪一个像素被遮挡;
5) Blending:混合,混合是将片段的颜色和帧缓冲区中已有的颜色值进行混合,并将混合所得的新值写入帧缓冲;
6) Dithering:抖动,抖动是使用有限的色彩让你看到比实际图象更多色彩的显示方式,以解决由于表示颜色的值的精度不够大而导致的颜色剧变的问题。
7.Framebuffer:这是流水线的最后一个阶段,Framebuffer中存储这可以用于渲染到屏幕或纹理中的像素值,也可以从Framebuffer中读回像素值,但不能读取其他值(如深度值,模版值等)。
02
1.光照介绍
光的反射
理想的漫反射表面把光线向所有方向均匀的散射,因此,这样的表面在所有观察者看来亮度都一样,理想的慢反射表面是如此粗糙,以至于向各个方向反射的光线强度都相等.这样的表面被成为Lambert表面(兰博特),OpenGL固定管线,或者Shader基于这个定律来建模。
镜子反射光时会很耀眼,镜面反射会形成强烈的光反射,反射的路线与入射方向 和表面法线形成的反射方向保持一致,镜面反射依赖于观察者所处的位置.当反射方向指向观察者时,光线最强,当反射光线离开观察者时,光线强度呈指数下降。

光的模型
OpenGL 光照模型中最终的光照效果可以分为四个组成部分:Emitted(发射光), Ambient(环境光),Diffuse(漫射光)和Specular(镜面反射光),最终结果由这四种光叠加而成。

光的计算
➢发射光计算:
发射颜色 = 物体的发射材质颜色
➢环境光计算:
环境颜色 = 光源的环境光颜色× 物体的环境材质颜色
➢漫反射光计算:
漫反射颜色 = 光源的漫反射光颜色 × 物体的漫反射材质颜色 × DiffuseFactor
➢中漫反射因子 DiffuseFactor 是光线与顶点法线向量的点积:
DiffuseFactor = max(0, dot(N, L))
➢镜面反射:
镜面反射颜色 = 光源的镜面光颜色 × 物体的镜面材质颜色 × SpecularFactor
SpecularFactor = power(max(0, dot(N, H)),shininess)
H = normalise(L + E)

镜面反射
与漫反射不同,镜面反射受观察者的位置影响
2.Kanzi 中的光照材质
上述知识中我们了解到,OpenGL渲染3D元素主要是通过材质来控制的,因此Kanzi Studio中提供了基本的Phong光照模型,基本的光照计算可以参考光照计算中的数学公式。
关于Kanzi:Rightware®作为世界领先的车载HMI解决方案供应商,致力于为用户提供先进的界面开发工具和服务。怿星科技作为Rightware公司在中国的重要合作伙伴,对使用Kanzi进行复杂UI效果开发,积累了丰富的量产经验。
看了以上分享内容,
你是否已学会了,
如何使用Kanzi Studio实现3D元素渲染
![]()
怿星一意,专注车载
引领汽车科技新高度



微信ID:e-planet