UE4学习009-渲染Coding初探
2019-06-11 本文已影响8人
cdf02aaf6ae2
UE4学习009-渲染Coding初探
在 UE4 中用 BP 进行渲染编程已经很嗨,且足以满足几乎所有的需求,但人的好奇心是没有止境的,总想看看它底层到底做了什么,是怎么做的
官方有一个系列文章,网上还有一个系列文章,讲如何用 HLSL 手写 Shader。两个系列讲的都很详细,每一个步骤及目的说的也很清楚,但最后一步还是没触及底层,所以本文以我的理解加以补充,建议跟这两个系列的文章同参
NOTE
建议先看网上这个系列,该示例仅演示用自定义颜色画一个球,相比官方的更加简单直接
RHI
能看本文及上述文章的,便假设对 openGL、D3D 等已经有了基本的了解
为了做到跨平台,UE4 在这些平台的 3D API 上面又抽象封装一层,这便是 RHI(Render Hardware Interface)
以 FOpenGLDynamicRHI 为例,打开 UnrealEngine/Engine/Source/Runtime/OpenGLDrv/Private/OpenGLCommands.cpp
,便可以看到熟悉的 gl 指令调用
void FOpenGLDynamicRHI::RHIDrawIndexedPrimitive(FIndexBufferRHIParamRef IndexBufferRHI,int32 BaseVertexIndex,uint32 FirstInstance,uint32 NumVertices,uint32 StartIndex,uint32 NumPrimitives,uint32 NumInstances)
{
//...
if (NumInstances > 1)
{
//...
}
else
{
//...
if ( FOpenGL::SupportsDrawIndexOffset() )
{
FOpenGL::DrawRangeElements(DrawMode, 0, NumVertices, NumElements, IndexType, INDEX_TO_VOID(StartIndex));
}
else
{
glDrawElements(DrawMode, NumElements, IndexType, INDEX_TO_VOID(StartIndex));
}
//...
}
}
RHICmdList
有了上一层基础,回头看代码,发现并没有对 RHI 的直接调用,而是看到了个 RHICmdList 的东西,这又是什么呢?
如果我们直接用 openGL 做一些简单的东西,当然是一个又一个的 gl 指令调用最直接。但对于 UE4 这样的大型项目,这样不利于开发维护和做性能优化。因此它又加了一层,把每一个指令调用,封装为一个 RenderCommand,把一系列这样的 Command,组织成为一个 RHICmdList
至此,我们才把本文开始说的那两个系列文章的最后一步跟最底层的 3D API 衔接了起来。