Renderer2d¶
函数drawcircle
定结构
struct CircleVertex
{
glm::vec3 WorldPosition;
glm::vec3 LocalPosition;
glm::vec4 Color;
float Thickness;
float Fade;
// Editor-only
int EntityID;
};
Init
// Circles
s_Data.CircleVertexArray = VertexArray::Create();
s_Data.CircleVertexBuffer = VertexBuffer::Create(s_Data.MaxVertices * sizeof(CircleVertex));
s_Data.CircleVertexBuffer->SetLayout({
{ ShaderDataType::Float3, "a_WorldPosition" },
{ ShaderDataType::Float3, "a_LocalPosition" },
{ ShaderDataType::Float4, "a_Color" },
{ ShaderDataType::Float, "a_Thickness" },
{ ShaderDataType::Float, "a_Fade" },
{ ShaderDataType::Int, "a_EntityID" }
});
s_Data.CircleVertexArray->AddVertexBuffer(s_Data.CircleVertexBuffer);
s_Data.CircleVertexArray->SetIndexBuffer(quadIB); // Use quad IB
s_Data.CircleVertexBufferBase = new CircleVertex[s_Data.MaxVertices];
//添加纹理shader
s_Data.QuadShader = Shader::Create("assets/shaders/Renderer2D_Quad.glsl");
s_Data.CircleShader = Shader::Create("assets/shaders/Renderer2D_Circle.glsl");
flush:分别计算秋和圆的缓冲
void Renderer2D::Flush()
{
if (s_Data.QuadIndexCount)
{
uint32_t dataSize = (uint32_t)((uint8_t*)s_Data.QuadVertexBufferPtr - (uint8_t*)s_Data.QuadVertexBufferBase);
s_Data.QuadVertexBuffer->SetData(s_Data.QuadVertexBufferBase, dataSize);
// Bind textures
for (uint32_t i = 0; i < s_Data.TextureSlotIndex; i++)
s_Data.TextureSlots[i]->Bind(i);
s_Data.QuadShader->Bind();
RenderCommand::DrawIndexed(s_Data.QuadVertexArray, s_Data.QuadIndexCount);
s_Data.Stats.DrawCalls++;
}
if (s_Data.CircleIndexCount)
{
uint32_t dataSize = (uint32_t)((uint8_t*)s_Data.CircleVertexBufferPtr - (uint8_t*)s_Data.CircleVertexBufferBase);
s_Data.CircleVertexBuffer->SetData(s_Data.CircleVertexBufferBase, dataSize);
s_Data.CircleShader->Bind();
RenderCommand::DrawIndexed(s_Data.CircleVertexArray, s_Data.CircleIndexCount);
s_Data.Stats.DrawCalls++;
}
}
DrawCircle 绘制、设置参数,然后圆缓冲+1,但本质还是quad绘制成的
void Renderer2D::DrawCircle(const glm::mat4& transform, const glm::vec4& color, float thickness /*= 1.0f*/, float fade /*= 0.005f*/, int entityID /*= -1*/)
{
CD_PROFILE_FUNCTION();
// TODO: implement for circles
// if (s_Data.QuadIndexCount >= Renderer2DData::MaxIndices)
// NextBatch();
for (size_t i = 0; i < 4; i++)
{
s_Data.CircleVertexBufferPtr->WorldPosition = transform * s_Data.QuadVertexPositions[i];
s_Data.CircleVertexBufferPtr->LocalPosition = s_Data.QuadVertexPositions[i] * 2.0f;
s_Data.CircleVertexBufferPtr->Color = color;
s_Data.CircleVertexBufferPtr->Thickness = thickness;
s_Data.CircleVertexBufferPtr->Fade = fade;
s_Data.CircleVertexBufferPtr->EntityID = entityID;
s_Data.CircleVertexBufferPtr++;
}
s_Data.CircleIndexCount += 6;
s_Data.Stats.QuadCount++;
}
Components¶
啊?不应该通过mesh来选择渲染方式么?
struct CircleRendererComponent
{
glm::vec4 Color{ 1.0f, 1.0f, 1.0f, 1.0f };
float Thickness = 1.0f;
float Fade = 0.005f;
CircleRendererComponent() = default;
CircleRendererComponent(const CircleRendererComponent&) = default;
};
后面基本上都是对这个component的处理