void FFinalSkinVertexBuffer::InitVertexData(FStaticLODModel& LodModel)
{
	// Create the buffer rendering resource
	uint32 Size = LodModel.NumVertices * sizeof(FFinalSkinVertex);

	FRHIResourceCreateInfo CreateInfo;
	void* Buffer = nullptr;
	VertexBufferRHI = RHICreateAndLockVertexBuffer(Size,BUF_Dynamic, CreateInfo, Buffer);	

	// Initialize the vertex data
	// All chunks are combined into one (rigid first, soft next)
	check(LodModel.VertexBufferGPUSkin.GetNumVertices() == LodModel.NumVertices);

	FFinalSkinVertex* DestVertex = (FFinalSkinVertex*)Buffer;
	for( uint32 VertexIdx=0; VertexIdx < LodModel.NumVertices; VertexIdx++ )
	{
		const TGPUSkinVertexBase<bExtraBoneInfluencesT>* SrcVertex = LodModel.VertexBufferGPUSkin.GetVertexPtr<bExtraBoneInfluencesT>(VertexIdx);

		DestVertex->Position = LodModel.VertexBufferGPUSkin.GetVertexPositionFast<bExtraBoneInfluencesT>(VertexIdx);
		DestVertex->TangentX = SrcVertex->TangentX;
		// w component of TangentZ should already have sign of the tangent basis determinant
		DestVertex->TangentZ = SrcVertex->TangentZ;

		FVector2D UVs = LodModel.VertexBufferGPUSkin.GetVertexUVFast<bExtraBoneInfluencesT>(VertexIdx,0);
		DestVertex->U = UVs.X;
		DestVertex->V = UVs.Y;

		DestVertex++;
	}

	// Unlock the buffer.
	RHIUnlockVertexBuffer(VertexBufferRHI);
}
    virtual void InitRHI() override
    {
        FRHIResourceCreateInfo CreateInfo;
        void* VertexBufferData = nullptr;
        VertexBufferRHI = RHICreateAndLockVertexBuffer(Vertices.Num() * sizeof(FDynamicMeshVertex), BUF_Static, CreateInfo, VertexBufferData);

        // Copy the vertex data into the vertex buffer.
        FMemory::Memcpy(VertexBufferData, Vertices.GetData(), Vertices.Num() * sizeof(FDynamicMeshVertex));
        RHIUnlockVertexBuffer(VertexBufferRHI);
    }
/** 
* Initialize the RHI for this rendering resource 
*/
void FLandscapeVertexBufferMobile::InitRHI()
{
	// create a static vertex buffer
	FRHIResourceCreateInfo CreateInfo;
	void* VertexData = nullptr;
	VertexBufferRHI = RHICreateAndLockVertexBuffer(DataSize, BUF_Static, CreateInfo, VertexData);
	
	// Copy stored platform data
	FMemory::Memcpy(VertexData, (uint8*)Data, DataSize);
	RHIUnlockVertexBuffer(VertexBufferRHI);
}
	/**
	 * Initialize the RHI for this rendering resource
	 */
	virtual void InitRHI() override
	{
		// create a static vertex buffer
		FRHIResourceCreateInfo CreateInfo;
		void* BufferData = nullptr;
		VertexBufferRHI = RHICreateAndLockVertexBuffer(sizeof(FVector2D) * 4, BUF_Static | BUF_ShaderResource, CreateInfo, BufferData);
		FMemory::Memzero(BufferData, sizeof(FVector2D) * 4);
		RHIUnlockVertexBuffer(VertexBufferRHI);
		
		VertexBufferSRV = RHICreateShaderResourceView(VertexBufferRHI, sizeof(FVector2D), PF_G32R32F);
	}
/**
 * Creates a vertex buffer holding texture coordinates for the four corners of a sprite.
 */
void FParticleTexCoordVertexBuffer::InitRHI()
{
    const uint32 Size = sizeof(FVector2D) * 4 * MAX_PARTICLES_PER_INSTANCE;
    FRHIResourceCreateInfo CreateInfo;
    void* BufferData = nullptr;
    VertexBufferRHI = RHICreateAndLockVertexBuffer(Size, BUF_Static, CreateInfo, BufferData);
    FVector2D* Vertices = (FVector2D*)BufferData;
    for (uint32 SpriteIndex = 0; SpriteIndex < MAX_PARTICLES_PER_INSTANCE; ++SpriteIndex)
    {
        Vertices[SpriteIndex*4 + 0] = FVector2D(0.0f, 0.0f);
        Vertices[SpriteIndex*4 + 1] = FVector2D(0.0f, 1.0f);
        Vertices[SpriteIndex*4 + 2] = FVector2D(1.0f, 1.0f);
        Vertices[SpriteIndex*4 + 3] = FVector2D(1.0f, 0.0f);
    }
    RHIUnlockVertexBuffer( VertexBufferRHI );
}
/**
 * Creates a vertex buffer holding texture coordinates for eight corners of a polygon.
 */
void FParticleEightTexCoordVertexBuffer::InitRHI()
{
    const uint32 Size = sizeof(FVector2D) * 8 * MAX_PARTICLES_PER_INSTANCE;
    FRHIResourceCreateInfo CreateInfo;
    void* BufferData = nullptr;
    VertexBufferRHI = RHICreateAndLockVertexBuffer(Size, BUF_Static, CreateInfo, BufferData);
    FVector2D* Vertices = (FVector2D*)BufferData;
    for (uint32 SpriteIndex = 0; SpriteIndex < MAX_PARTICLES_PER_INSTANCE; ++SpriteIndex)
    {
        // The contents of this buffer does not matter, whenever it is used, cutout geometry will override
        Vertices[SpriteIndex*8 + 0] = FVector2D(0.0f, 0.0f);
        Vertices[SpriteIndex*8 + 1] = FVector2D(0.0f, 1.0f);
        Vertices[SpriteIndex*8 + 2] = FVector2D(1.0f, 1.0f);
        Vertices[SpriteIndex*8 + 3] = FVector2D(1.0f, 0.0f);
        Vertices[SpriteIndex*8 + 4] = FVector2D(1.0f, 0.0f);
        Vertices[SpriteIndex*8 + 5] = FVector2D(1.0f, 0.0f);
        Vertices[SpriteIndex*8 + 6] = FVector2D(1.0f, 0.0f);
        Vertices[SpriteIndex*8 + 7] = FVector2D(1.0f, 0.0f);
    }
    RHIUnlockVertexBuffer( VertexBufferRHI );
}
void FFinalSkinVertexBuffer::InitVertexData(FStaticLODModel& LodModel)
{
	// this used to be check, but during clothing importing (when replacing Apex asset)
	// it comes here with incomplete data causing crash during that intermediate state
	// so I'm changing to ensure, and update won't do anything since it contains Invalid VertexBufferRHI
	if (ensure(LodModel.VertexBufferGPUSkin.GetNumVertices() == LodModel.NumVertices))
	{
		// Create the buffer rendering resource
		uint32 Size = LodModel.NumVertices * sizeof(FFinalSkinVertex);

		// Initialize the vertex data
		// All chunks are combined into one (rigid first, soft next)
		FRHIResourceCreateInfo CreateInfo;
		void* Buffer = nullptr;
		VertexBufferRHI = RHICreateAndLockVertexBuffer(Size, BUF_Dynamic, CreateInfo, Buffer);

		FFinalSkinVertex* DestVertex = (FFinalSkinVertex*)Buffer;
		for (uint32 VertexIdx = 0; VertexIdx < LodModel.NumVertices; VertexIdx++)
		{
			const TGPUSkinVertexBase<bExtraBoneInfluencesT>* SrcVertex = LodModel.VertexBufferGPUSkin.GetVertexPtr<bExtraBoneInfluencesT>(VertexIdx);

			DestVertex->Position = LodModel.VertexBufferGPUSkin.GetVertexPositionFast<bExtraBoneInfluencesT>(VertexIdx);
			DestVertex->TangentX = SrcVertex->TangentX;
			// w component of TangentZ should already have sign of the tangent basis determinant
			DestVertex->TangentZ = SrcVertex->TangentZ;

			FVector2D UVs = LodModel.VertexBufferGPUSkin.GetVertexUVFast<bExtraBoneInfluencesT>(VertexIdx, 0);
			DestVertex->U = UVs.X;
			DestVertex->V = UVs.Y;

			DestVertex++;
		}

		// Unlock the buffer.
		RHIUnlockVertexBuffer(VertexBufferRHI);
	}
}