美文网首页UE4(虚幻引擎)
UE4学习009-渲染Coding初探

UE4学习009-渲染Coding初探

作者: cdf02aaf6ae2 | 来源:发表于2019-06-11 10:50 被阅读8次

    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 衔接了起来。

    相关文章

      网友评论

        本文标题:UE4学习009-渲染Coding初探

        本文链接:https://www.haomeiwen.com/subject/znazxctx.html