游戏渲染

本文深入解析游戏渲染技术,包括DrawCall、OpenGL渲染流程、材质球、纹理处理、批处理、Shader、SubShader、Pass以及LOD技术。详细阐述了从模型文件到最终画面的全过程,如FBX到MeshRender的转换,GPU的顶点着色、光栅化及片元着色过程,以及如何通过批处理和LOD提高渲染效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DrawCall

由CPU收集美术的资源信息,传递给GPU,通知GPU进行一次渲染过程叫DrawCall

OpenGl 渲染流程

cpu :

FBX->Meshrender
FBX obj : 模型文件,包含UV、顶点位置、法线切线等渲染信息
MeshRender : 将信息传给GPU
Meshfilter : 将那个模型信息传给GPU

gpu:

顶点着色器->光栅化->片元着色器->alpha测试->模板测试->深度测试->Blend->显示信息

材质球:

Shader + Texture

顶点着色器:顶点信息处理
光栅化:将顶点转换为像素
片元着色器:

图片处理

纹理处理(Filter Mode):

Point:就近采样
Bilinear:线型采样
Trilinear:三线性采样

批处理:

相同的材质,合并起来进行一次渲染.
Dynamic batching: for small enough Meshes, this transforms their vertices on the CPU, groups many similar vertices together, and draws them all in one go.
Static batching: combines static (not moving) GameObjects into big Meshes, and renders them in a faster way.

NGUI

UIWidget存放UI中的顶点法线UV等信息

同一个图集的深度区间要放到同一个区间中

1.UIWiget在Onstart()中递归的寻找父物体CreatePanel()直到找到第一个UIPanel
2.将UIWiget自身加入UIPanel中存放全部UIWiget的集合中。
3.在UIPanel中lateUpdate逐帧渲染,调用UpdateSelf渲染每一个UIWiget
4.UIWiget调用FillAllDrawCalls,SortWidgets对所有子物体按深度、材质、id排序,这样通过对不同图集之间物体进行深度控制,让同一个图集的物体在一个深度区间。通过对材质前后文进行对比,直到与上一个材质不同的,再新建一个DrawCall。

Shader

SubShader

Each shader in Unity consists of a list of subshaders. When Unity has to display a mesh, it will find the shader to use, and pick the first subshader that runs on the user’s graphics card.

Pass

A subshader defines a list of rendering passes and optionally setup any state that is common to all passes.
When Unity chooses which subshader to render with, it renders an object once for each Pass defined

用例:
旗子飘动效果(顶点y坐标变换)

在顶点着色器中使用简谐波根据x偏移y坐标

        v2f vert(a2v i) {
            float timeOffset = _Time.y * _WaveOffsetSpeed;
            i.vertex.y += _WaveH * sin(_WaveSpeed*i.vertex.x + timeOffset);
            v2f o;
            o.vertex = UnityObjectToClipPos(i.vertex);
            o.uv = TRANSFORM_TEX(i.uv, _MainTex);
            return o;
        }

河流流动效果(纹理坐标的变换)

在片元着色器中对纹理坐标进行变换

        fixed4 frag(v2f v) :SV_Target{
            float2 mUV = v.uv;
            mUV.y += _Time.y;
            fixed4 col = tex2D(_MainTex,mUV);
            return col;
        }

LOD
LOD技术即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值