UE4(虚幻引擎)

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)

RHI

以 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

RHICmdList

至此,我们才把本文开始说的那两个系列文章的最后一步跟最底层的 3D API 衔接了起来。

上一篇 下一篇

猜你喜欢

热点阅读