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); } }