summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-10-28 01:52:12 +0800
committerchai <chaifix@163.com>2021-10-28 01:52:12 +0800
commit80dca084b568e4e77d2a4031ce8625cdabc660ab (patch)
treed8c0172aeddca648ec89cbbbda72a938f3ef7433
parent1b6f71b2777bdc74d63f988346a8cfee766718b0 (diff)
+ custom vertex buffer
-rw-r--r--Projects/VisualStudio/Editor/Editor.vcxproj5
-rw-r--r--Projects/VisualStudio/Editor/Editor.vcxproj.filters15
-rw-r--r--Runtime/Graphics/CustomVertexLayout.cpp23
-rw-r--r--Runtime/Graphics/CustomVertexLayout.h9
-rw-r--r--Runtime/Graphics/DefaultVertexLayout.h1
-rw-r--r--Runtime/Graphics/GfxDevice.h1
-rw-r--r--Runtime/Graphics/Primitive.h8
-rw-r--r--Runtime/Graphics/SharedVertexBuffer.cpp199
-rw-r--r--Runtime/Graphics/SharedVertexBuffer.h54
-rw-r--r--Runtime/Graphics/UIQuad.cpp61
-rw-r--r--Runtime/Graphics/UIQuad.h11
-rw-r--r--Runtime/Graphics/VertexAttribute.h18
-rw-r--r--Runtime/Graphics/VertexBuffer.h46
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