diff options
author | chai <chaifix@163.com> | 2021-10-28 01:52:12 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-28 01:52:12 +0800 |
commit | 80dca084b568e4e77d2a4031ce8625cdabc660ab (patch) | |
tree | d8c0172aeddca648ec89cbbbda72a938f3ef7433 | |
parent | 1b6f71b2777bdc74d63f988346a8cfee766718b0 (diff) |
+ custom vertex buffer
-rw-r--r-- | Projects/VisualStudio/Editor/Editor.vcxproj | 5 | ||||
-rw-r--r-- | Projects/VisualStudio/Editor/Editor.vcxproj.filters | 15 | ||||
-rw-r--r-- | Runtime/Graphics/CustomVertexLayout.cpp | 23 | ||||
-rw-r--r-- | Runtime/Graphics/CustomVertexLayout.h | 9 | ||||
-rw-r--r-- | Runtime/Graphics/DefaultVertexLayout.h | 1 | ||||
-rw-r--r-- | Runtime/Graphics/GfxDevice.h | 1 | ||||
-rw-r--r-- | Runtime/Graphics/Primitive.h | 8 | ||||
-rw-r--r-- | Runtime/Graphics/SharedVertexBuffer.cpp | 199 | ||||
-rw-r--r-- | Runtime/Graphics/SharedVertexBuffer.h | 54 | ||||
-rw-r--r-- | Runtime/Graphics/UIQuad.cpp | 61 | ||||
-rw-r--r-- | Runtime/Graphics/UIQuad.h | 11 | ||||
-rw-r--r-- | Runtime/Graphics/VertexAttribute.h | 18 | ||||
-rw-r--r-- | Runtime/Graphics/VertexBuffer.h | 46 |
13 files changed, 342 insertions, 109 deletions
diff --git a/Projects/VisualStudio/Editor/Editor.vcxproj b/Projects/VisualStudio/Editor/Editor.vcxproj index e2fbda7..04a853b 100644 --- a/Projects/VisualStudio/Editor/Editor.vcxproj +++ b/Projects/VisualStudio/Editor/Editor.vcxproj @@ -178,6 +178,7 @@ <ClCompile Include="..\..\..\Runtime\FileSystem\Path.cpp" />
<ClCompile Include="..\..\..\Runtime\FileSystem\Unzip.cpp" />
<ClCompile Include="..\..\..\Runtime\Graphics\CustomVertexLayout.cpp" />
+ <ClCompile Include="..\..\..\Runtime\Graphics\CustomVertexLayout.cpp" />
<ClCompile Include="..\..\..\Runtime\Graphics\DefaultVertexLayout.cpp" />
<ClCompile Include="..\..\..\Runtime\Graphics\GfxDevice.cpp" />
<ClCompile Include="..\..\..\Runtime\Graphics\FrameBuffer.cpp" />
@@ -193,6 +194,7 @@ <ClCompile Include="..\..\..\Runtime\Graphics\ShaderCompiler.cpp" />
<ClCompile Include="..\..\..\Runtime\Graphics\SharedVertexBuffer.cpp" />
<ClCompile Include="..\..\..\Runtime\Graphics\Texture.cpp" />
+ <ClCompile Include="..\..\..\Runtime\Graphics\UIQuad.cpp" />
<ClCompile Include="..\..\..\Runtime\Graphics\VertexAttribute.cpp" />
<ClCompile Include="..\..\..\Runtime\Graphics\VertexBuffer.cpp" />
<ClCompile Include="..\..\..\Runtime\Lua\LuaBind\LuaBindCFunctions.cpp" />
@@ -264,11 +266,14 @@ <ClInclude Include="..\..\..\Runtime\Graphics\OpenGL.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\Point.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\PolyLine.h" />
+ <ClInclude Include="..\..\..\Runtime\Graphics\Primitive.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\Quad.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\RenderTexture.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\Shader.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\ShaderCompiler.h" />
+ <ClInclude Include="..\..\..\Runtime\Graphics\SharedVertexBuffer.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\Texture.h" />
+ <ClInclude Include="..\..\..\Runtime\Graphics\UIQuad.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\VertexAttribute.h" />
<ClInclude Include="..\..\..\Runtime\Graphics\VertexBuffer.h" />
<ClInclude Include="..\..\..\Runtime\Lua\LuaBind\LuaBind.h" />
diff --git a/Projects/VisualStudio/Editor/Editor.vcxproj.filters b/Projects/VisualStudio/Editor/Editor.vcxproj.filters index 1b419c4..3aa90fd 100644 --- a/Projects/VisualStudio/Editor/Editor.vcxproj.filters +++ b/Projects/VisualStudio/Editor/Editor.vcxproj.filters @@ -369,6 +369,12 @@ <ClCompile Include="..\..\..\Runtime\Graphics\VertexAttribute.cpp">
<Filter>Runtime\Graphics</Filter>
</ClCompile>
+ <ClCompile Include="..\..\..\Runtime\Graphics\CustomVertexLayout.cpp">
+ <Filter>Runtime\Graphics</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\Runtime\Graphics\UIQuad.cpp">
+ <Filter>Runtime\Graphics</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\Editor\GUI\Dock.h">
@@ -614,6 +620,15 @@ <ClInclude Include="..\..\..\Runtime\Graphics\VertexAttribute.h">
<Filter>Runtime\Graphics</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\Runtime\Graphics\SharedVertexBuffer.h">
+ <Filter>Runtime\Graphics</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\Runtime\Graphics\Primitive.h">
+ <Filter>Runtime\Graphics</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\Runtime\Graphics\UIQuad.h">
+ <Filter>Runtime\Graphics</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\..\Runtime\Lua\LuaBind\LuaBindClass.inc">
diff --git a/Runtime/Graphics/CustomVertexLayout.cpp b/Runtime/Graphics/CustomVertexLayout.cpp index e69de29..aa6be9b 100644 --- a/Runtime/Graphics/CustomVertexLayout.cpp +++ b/Runtime/Graphics/CustomVertexLayout.cpp @@ -0,0 +1,23 @@ +#include "CustomVertexLayout.h" + +namespace VertexLayout +{ + + void SetupCustomVertexLayout(CustomVertexLayout& info) + { + glBindBuffer(GL_ARRAY_BUFFER, info.buffer); + for (int i = 0; i < info.attributes.size(); ++i) + { + VertexAttributeDescriptor& attr = info.attributes[i]; + glEnableVertexAttribArray(i); + int numCompo = attr.componentNum; + GLenum compoType = VertexAttribute::ConvertAttrFormatToGLFormat(attr.componentFormat); + bool normalized = attr.normalize; + uint stride = attr.stride; + const void* pointer = attr.pointer; + + glVertexAttribPointer(i, numCompo, compoType, normalized ? GL_TRUE : GL_FALSE, stride, pointer); + } + } + +} diff --git a/Runtime/Graphics/CustomVertexLayout.h b/Runtime/Graphics/CustomVertexLayout.h index 402e663..86dcf90 100644 --- a/Runtime/Graphics/CustomVertexLayout.h +++ b/Runtime/Graphics/CustomVertexLayout.h @@ -9,7 +9,14 @@ struct CustomVertexLayout { - GLuint buffer; + GLuint buffer; // 创建时留空 std::vector<VertexAttributeDescriptor> attributes; }; +namespace VertexLayout +{ + + extern void SetupCustomVertexLayout(CustomVertexLayout& layout); + +} + diff --git a/Runtime/Graphics/DefaultVertexLayout.h b/Runtime/Graphics/DefaultVertexLayout.h index 2d78518..fbb1f76 100644 --- a/Runtime/Graphics/DefaultVertexLayout.h +++ b/Runtime/Graphics/DefaultVertexLayout.h @@ -35,6 +35,7 @@ struct DefaultVertexLayout namespace VertexLayout { + // ibo无论是default还是custom布局都是short extern uint GetDefaultIndexSize(); extern GLenum GetDefaultIndexFormat(); diff --git a/Runtime/Graphics/GfxDevice.h b/Runtime/Graphics/GfxDevice.h index 70ce8e6..ab35428 100644 --- a/Runtime/Graphics/GfxDevice.h +++ b/Runtime/Graphics/GfxDevice.h @@ -8,6 +8,7 @@ #include "Texture.h" #include "DeviceDefine.h" #include "VertexBuffer.h" +#include "SharedVertexBuffer.h" #include "Color.h" struct GfxDeviceSetting diff --git a/Runtime/Graphics/Primitive.h b/Runtime/Graphics/Primitive.h new file mode 100644 index 0000000..6636221 --- /dev/null +++ b/Runtime/Graphics/Primitive.h @@ -0,0 +1,8 @@ +#pragma once + +enum EPrimitive +{ + Primitive_Triangle = 1, + Primitive_Line = 2, + Primitive_Point = 3, +}; diff --git a/Runtime/Graphics/SharedVertexBuffer.cpp b/Runtime/Graphics/SharedVertexBuffer.cpp index d547b3c..464a919 100644 --- a/Runtime/Graphics/SharedVertexBuffer.cpp +++ b/Runtime/Graphics/SharedVertexBuffer.cpp @@ -1,4 +1,4 @@ -#include "VertexBuffer.h" +#include "SharedVertexBuffer.h" #include "../Profiling/FrameStats.h" SharedVertexBuffer::SharedVertexBuffer() @@ -9,6 +9,9 @@ SharedVertexBuffer::~SharedVertexBuffer() { } +//------------------------------------------------------------------------------------------------------------ +// Defualt Vertex Layout + //GetChunk //-> ReleaseChunk //-> DrawChunk @@ -18,13 +21,102 @@ void SharedVertexBuffer::GetChunk(uint attrsMask, int maxVerts, int maxIndices, Assert(out_vb && out_ib); uint stride = VertexLayout::GetDynamicChunkStride(attrsMask); // data size of single vertex - GLenum usage = GL_STREAM_DRAW; - uint vbufferSize = stride * maxVerts; - uint ibufferSize = VertexLayout::GetDefaultIndexSize() * maxIndices; + GetChunk(stride, maxVerts, VertexLayout::GetDefaultIndexSize(), maxIndices, primitive, out_vb, out_ib); + + // default layout + m_CurAttrMask = attrsMask; + m_CurStride = stride; +} + +void SharedVertexBuffer::DrawChunk() +{ + DefaultVertexLayout vertexArray; + FillDefaultVertexLayout(vertexArray); + + // bind vertex attributes data + VertexLayout::SetupDefaultVertexLayout(vertexArray); + + const void* indexPtr = m_CurIB ? 0 : (m_CurIBData.empty() ? 0 : &m_CurIBData[0]); + + if (m_CurIB) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_CurIB->GetHandle()); + + GLenum indexFormat = VertexLayout::GetDefaultIndexFormat(); + + switch (m_CurPrimitive) + { + case Primitive_Triangle: + glDrawElements(GL_TRIANGLES, m_CurIndexCount, indexFormat, indexPtr); + g_FrameStats.AddDrawCall(); + g_FrameStats.AddTrianglesCount(m_CurIndexCount / 3); + break; + case Primitive_Line: + glDrawElements(GL_LINE, m_CurIndexCount, indexFormat, indexPtr); + g_FrameStats.AddDrawCall(); + break; + case Primitive_Point: + glDrawElements(GL_POINT, m_CurIndexCount, indexFormat, indexPtr); + g_FrameStats.AddDrawCall(); + break; + } + + if (m_CurIB) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + // End draw + Clean(); +} + +void SharedVertexBuffer::FillDefaultVertexLayout(DefaultVertexLayout& dst) +{ + const byte* basepointer = m_CurVB ? 0 : &m_CurVBData[0]; + const GLuint buffer = m_CurVB ? m_CurVB->GetHandle() : 0; + + int attrOffsets[VertexAttr_Count] = { 0 }; + { + uint32 curOffset = 0; + for (uint idx = 0; idx < VertexAttr_Count; ++idx) + { + if (m_CurAttrMask & Mask(idx)) + { + attrOffsets[idx] = curOffset; + curOffset += VertexLayout::GetDefaultVertexAttrSize(idx); + } + } + } + + dst.buffer = buffer; + + for (uint32 attrIdx = 0; attrIdx < VertexAttr_Count; ++attrIdx) + { + if (m_CurAttrMask & Mask(attrIdx)) + { + dst.attributes[attrIdx].pointer = basepointer + attrOffsets[attrIdx]; + dst.attributes[attrIdx].componentFormat = VertexLayout::GetDefaultShaderChannelFormat(attrIdx); + dst.attributes[attrIdx].componentNum = VertexLayout::GetDefaultShaderChannelDimension(attrIdx); + dst.attributes[attrIdx].stride = m_CurStride; + + dst.enableMask |= Mask(attrIdx); + } + } +} + +//------------------------------------------------------------------------------------------------------------ +// Custom Vertex Layout + +// 用buffersize为依据决定用vbo或者pinned memory +void SharedVertexBuffer::GetChunk(uint sizePerVert, uint sizePerIndex, int maxVerts, int maxIndices, EPrimitive primitive, void **out_vb, void **out_ib) +{ + Assert(out_vb && out_ib); + + uint vbufferSize = sizePerVert * maxVerts; + uint ibufferSize = sizePerIndex * maxIndices; const bool mapVertexBuffer = vbufferSize >= DataBufferThreshold; const bool mapIndexBuffer = ibufferSize >= DataBufferThreshold; + GLenum usage = GL_STREAM_DRAW; + GPU::DataBuffer* vertexBuffer = mapVertexBuffer ? GPU::ClaimBuffer(vbufferSize, usage) : 0; GPU::DataBuffer* indexBuffer = mapIndexBuffer ? GPU::ClaimBuffer(ibufferSize, usage) : 0; @@ -54,51 +146,32 @@ void SharedVertexBuffer::GetChunk(uint attrsMask, int maxVerts, int maxIndices, m_CurVB = vertexBuffer; m_CurIB = indexBuffer; + m_CurPrimitive = primitive; - m_CurAttrMask = attrsMask; - m_CurStride = stride; } -void SharedVertexBuffer::ReleaseChunk(int actualVerts, int actualIndices) +void SharedVertexBuffer::FillCustomVertexLayout(CustomVertexLayout& dst) { - int actualVBufferSize = m_CurStride * actualVerts; - int actualIBufferSize = VertexLayout::GetDefaultIndexSize() * actualIndices; - - const GLenum usage = GL_STREAM_DRAW; + const byte* basepointer = m_CurVB ? 0 : &m_CurVBData[0]; + const GLuint buffer = m_CurVB ? m_CurVB->GetHandle() : 0; - if (m_CurVB) - { - m_CurVB->FlushMapedRange(0, actualVBufferSize); - m_CurVB->UnMap(); - } - else if (actualVBufferSize >= DataBufferThreshold) - { - m_CurVB = GPU::ClaimBuffer(actualVBufferSize, usage); - m_CurVB->RestoreWithData(actualVBufferSize, usage, &m_CurVBData[0]); - } + dst.buffer = buffer; - if (m_CurIB) + for (int i = 0; i < dst.attributes.size(); ++i) { - m_CurIB->FlushMapedRange(0, actualIBufferSize); - m_CurIB->UnMap(); + int offset = dst.attributes[i].startOffset; + dst.attributes[i].pointer = basepointer + offset; } - else if (actualIBufferSize >= DataBufferThreshold) - { - m_CurIB = GPU::ClaimBuffer(0, usage); - m_CurIB->RestoreWithData(0, usage, &m_CurIBData[0]); - } - - m_CurVertexCount = actualVerts; - m_CurIndexCount = actualIndices; } -void SharedVertexBuffer::DrawChunk() +void SharedVertexBuffer::DrawChunk(CustomVertexLayout& layout) { - DefaultVertexLayout vertexArray; - FillVertexDataInfo(vertexArray); + const byte* basepointer = m_CurVB ? 0 : &m_CurVBData[0]; + const GLuint buffer = m_CurVB ? m_CurVB->GetHandle() : 0; - // bind vertex attributes data - VertexLayout::SetupDefaultVertexLayout(vertexArray); + FillCustomVertexLayout(layout); + + VertexLayout::SetupCustomVertexLayout(layout); const void* indexPtr = m_CurIB ? 0 : (m_CurIBData.empty() ? 0 : &m_CurIBData[0]); @@ -131,38 +204,40 @@ void SharedVertexBuffer::DrawChunk() Clean(); } -void SharedVertexBuffer::FillVertexDataInfo(DefaultVertexLayout& dst) +//------------------------------------------------------------------------------------------------------------ +// Both Default and Custom Vertex Layout + +void SharedVertexBuffer::ReleaseChunk(int actualVerts, int actualIndices) { - const byte* basepointer = m_CurVB ? 0 : &m_CurVBData[0]; - const GLuint buffer = m_CurVB ? m_CurVB->GetHandle() : 0; + int actualVBufferSize = m_CurStride * actualVerts; + int actualIBufferSize = VertexLayout::GetDefaultIndexSize() * actualIndices; - int attrOffsets[VertexAttr_Count] = { 0 }; + const GLenum usage = GL_STREAM_DRAW; + + if (m_CurVB) { - uint32 curOffset = 0; - for (uint idx = 0; idx < VertexAttr_Count; ++idx) - { - if (m_CurAttrMask & Mask(idx)) - { - attrOffsets[idx] = curOffset; - curOffset += VertexLayout::GetDefaultVertexAttrSize(idx); - } - } + m_CurVB->FlushMapedRange(0, actualVBufferSize); + m_CurVB->UnMap(); } - - dst.buffer = buffer; - - for (uint32 attrIdx = 0; attrIdx < VertexAttr_Count; ++attrIdx) + else if (actualVBufferSize >= DataBufferThreshold) { - if (m_CurAttrMask & Mask(attrIdx)) - { - dst.attributes[attrIdx].pointer = basepointer + attrOffsets[attrIdx]; - dst.attributes[attrIdx].componentFormat = VertexLayout::GetDefaultShaderChannelFormat(attrIdx); - dst.attributes[attrIdx].componentNum = VertexLayout::GetDefaultShaderChannelDimension(attrIdx); - dst.attributes[attrIdx].stride = m_CurStride; + m_CurVB = GPU::ClaimBuffer(actualVBufferSize, usage); + m_CurVB->RestoreWithData(actualVBufferSize, usage, &m_CurVBData[0]); + } - dst.enableMask |= Mask(attrIdx); - } + if (m_CurIB) + { + m_CurIB->FlushMapedRange(0, actualIBufferSize); + m_CurIB->UnMap(); + } + else if (actualIBufferSize >= DataBufferThreshold) + { + m_CurIB = GPU::ClaimBuffer(0, usage); + m_CurIB->RestoreWithData(0, usage, &m_CurIBData[0]); } + + m_CurVertexCount = actualVerts; + m_CurIndexCount = actualIndices; } void SharedVertexBuffer::Clean() diff --git a/Runtime/Graphics/SharedVertexBuffer.h b/Runtime/Graphics/SharedVertexBuffer.h new file mode 100644 index 0000000..001eb2c --- /dev/null +++ b/Runtime/Graphics/SharedVertexBuffer.h @@ -0,0 +1,54 @@ +#pragma once +#include <vector> + +#include "../Utilities/UtilMacros.h" +#include "../Shaders/ShaderChannel.h" + +#include "OpenGL.h" +#include "GPUDataBuffer.h" +#include "DefaultVertexLayout.h" +#include "CustomVertexLayout.h" +#include "Primitive.h" + +class SharedVertexBuffer +{ +public: + SharedVertexBuffer(); + ~SharedVertexBuffer(); + + // default layout + void GetChunk(uint attrs, int maxVerts, int maxIndices, EPrimitive primitive, void **out_vb, void **out_ib); + void ReleaseChunk(int actualVerts, int actualIndices); + void DrawChunk(); + + // custom layout + void GetChunk(uint sizePerVert, uint sizePerIndex, int maxVerts, int maxIndices, EPrimitive primitive, void **out_vb, void **out_ib); + void DrawChunk(CustomVertexLayout& layout); + +private: + + void FillCustomVertexLayout(CustomVertexLayout& dst); + void FillDefaultVertexLayout(DefaultVertexLayout& dst); + + void Clean(); + + // if vertex databuffer size beyond this value, use pinned memory mapping, instead of glBufferData. + enum { DataBufferThreshold = 1024 }; + + // shared vbo and ibo + GPU::DataBuffer *m_CurVB; + GPU::DataBuffer *m_CurIB; + + // restore vbo and ibo data if not using pinned memory mapping + std::vector<byte> m_CurVBData; + std::vector<uint16> m_CurIBData; + + EPrimitive m_CurPrimitive; + + uint m_CurAttrMask; // default layout + uint m_CurStride; // default layout + + uint m_CurVertexCount; + uint m_CurIndexCount; + +}; diff --git a/Runtime/Graphics/UIQuad.cpp b/Runtime/Graphics/UIQuad.cpp new file mode 100644 index 0000000..5f1a54d --- /dev/null +++ b/Runtime/Graphics/UIQuad.cpp @@ -0,0 +1,61 @@ +#include "../Math/Vector2.h" +#include "GfxDevice.h" +#include "UIQuad.h" + +struct UIQuadLayout +{ + Vector2 position; + Vector2 uv; +}; + +void UIQuad::Draw() +{ + CustomVertexLayout layout; + + VertexAttributeDescriptor POSITION = VertexAttributeDescriptor(0, 2, VertexAttrFormat_Float, sizeof(UIQuadLayout)); + VertexAttributeDescriptor UV = VertexAttributeDescriptor(sizeof(Vector2), 2, VertexAttrFormat_Float, sizeof(UIQuadLayout)); + + layout.attributes.push_back(POSITION); + layout.attributes.push_back(UV); + + const int nVerts = 4; + const int nIndices = 6; + + float pos[] = { + m_Left, m_Bottom, // left-bottom + m_Right, m_Bottom, // right-bottom + m_Right, m_Top, // right-top + m_Left, m_Top, // top-left + }; + + float uv[] = { + 0, 0, + 1, 0, + 1, 1, + 0, 1, + }; + + int indices[] = { + 0, 1, 3, // right-top + 1, 2, 3, // left-bottom + }; + + uint8* vb; + uint16* ib; + + g_SharedVBO.GetChunk(sizeof(UIQuadLayout), sizeof(uint16), 4, 6, Primitive_Triangle, (void**)&vb, (void**)&ib); + + UIQuadLayout* dst = (UIQuadLayout*)vb; + + for (int i = 0; i < nVerts; ++i) + { + dst[i].position.Set(pos[3 * i], pos[3 * i + 1]); + dst[i].uv.Set(uv[2 * i], uv[2 * i + 1]); + } + + for (int i = 0; i < nIndices; ++i) + ib[i] = indices[i]; + + g_SharedVBO.ReleaseChunk(4, 6); + g_SharedVBO.DrawChunk(layout); +}
\ No newline at end of file diff --git a/Runtime/Graphics/UIQuad.h b/Runtime/Graphics/UIQuad.h new file mode 100644 index 0000000..166b662 --- /dev/null +++ b/Runtime/Graphics/UIQuad.h @@ -0,0 +1,11 @@ +#pragma once + +class UIQuad +{ +public : + void Draw(); + +private: + float m_Left, m_Right, m_Top, m_Bottom; + +}; diff --git a/Runtime/Graphics/VertexAttribute.h b/Runtime/Graphics/VertexAttribute.h index 2e6e59f..4e50a1a 100644 --- a/Runtime/Graphics/VertexAttribute.h +++ b/Runtime/Graphics/VertexAttribute.h @@ -21,10 +21,26 @@ enum VertexAttrFormat struct VertexAttributeDescriptor { - const void* pointer; // 内存地址或显存中相对VBO的偏移值 + // for default vertex layout + VertexAttributeDescriptor() {} + // for custom vertex layout + VertexAttributeDescriptor(int startOff, uint num, uint fmt, uint16 strd, bool normalized = false) + { + startOffset = startOff; + componentNum = num; + componentFormat = fmt; + stride = strd; + normalize = normalized; + } + + union { + const void* pointer; // 内存地址或显存中相对VBO的偏移值 + int startOffset; + }; uint componentNum; // 向量维度1,2,3,4 uint componentFormat; // 每个分量的类型 uint16 stride; // 间隔 + bool normalize; // 是否归一化,只用于CustomVertexLayout }; namespace VertexAttribute diff --git a/Runtime/Graphics/VertexBuffer.h b/Runtime/Graphics/VertexBuffer.h index 05aa16c..382ca39 100644 --- a/Runtime/Graphics/VertexBuffer.h +++ b/Runtime/Graphics/VertexBuffer.h @@ -10,13 +10,7 @@ #include "GPUDataBuffer.h" #include "DefaultVertexLayout.h" #include "CustomVertexLayout.h" - -enum EPrimitive -{ - Primitive_Triangle = 1, - Primitive_Line = 2, - Primitive_Point = 3, -}; +#include "Primitive.h" class VertexBuffer { @@ -40,42 +34,4 @@ private: }; -class SharedVertexBuffer -{ -public: - SharedVertexBuffer(); - ~SharedVertexBuffer(); - - void GetChunk(uint attrs, int maxVerts, int maxIndices, EPrimitive primitive, void **out_vb, void **out_ib); - void ReleaseChunk(int actualVerts, int actualIndices); - - void DrawChunk(); - -private: - - void FillVertexDataInfo(DefaultVertexLayout& dst); - - void Clean(); - - // if vertex databuffer size beyond this value, use pinned memory mapping, instead of glBufferData. - enum { DataBufferThreshold = 1024 }; - - // shared vbo and ibo - GPU::DataBuffer *m_CurVB; - GPU::DataBuffer *m_CurIB; - - // restore vbo and ibo data if not using pinned memory mapping - std::vector<byte> m_CurVBData; - std::vector<uint16> m_CurIBData; - - EPrimitive m_CurPrimitive; - - uint m_CurAttrMask; - uint m_CurStride; - - uint m_CurVertexCount; - uint m_CurIndexCount; - -}; - #endif
\ No newline at end of file |