feat: rendering improvemenets
This commit is contained in:
@ -21,6 +21,7 @@ protected:
|
||||
private:
|
||||
unsigned int m_id;
|
||||
unsigned int m_instance_vbo { 0 };
|
||||
unsigned int m_instance_count { 0 };
|
||||
private:
|
||||
void prepare(glm::mat4 *instances, unsigned int count);
|
||||
};
|
||||
|
@ -11,9 +11,20 @@ batch::batch() {
|
||||
void batch::prepare(glm::mat4 *instances, unsigned int count) {
|
||||
if (m_instance_vbo == 0) {
|
||||
glGenBuffers(1, &m_instance_vbo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo);
|
||||
// Allocate *once*, no data yet — just reserve space
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * count, nullptr, GL_DYNAMIC_DRAW);
|
||||
m_instance_count = count;
|
||||
} else if (count > m_instance_count) {
|
||||
// Optional: reallocate only if you *really* have more instances than before
|
||||
glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * count, nullptr, GL_DYNAMIC_DRAW);
|
||||
m_instance_count = count;
|
||||
} else {
|
||||
glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo);
|
||||
}
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * count, reinterpret_cast<void*>(instances), GL_DYNAMIC_DRAW);
|
||||
|
||||
// Just update the data region — much cheaper
|
||||
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(glm::mat4) * count, instances);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
}
|
@ -205,12 +205,9 @@ void Renderer::GenerateShadowMaps() {
|
||||
void Renderer::Render() {
|
||||
m_depthShader.use();
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
glCullFace(GL_FRONT);
|
||||
|
||||
auto lights = m_registry.view<light, transform>();
|
||||
const auto lights = m_registry.view<light, transform>();
|
||||
|
||||
for (auto [_, l, t] : lights.each()) {
|
||||
// TODO: support other light types when ready
|
||||
@ -218,10 +215,10 @@ void Renderer::Render() {
|
||||
|
||||
EnsureShadowResources(l);
|
||||
|
||||
float near_plane = 0.1f, far_plane = 20.0f;
|
||||
// float near_plane = 0.1f, far_plane = 50.0f;
|
||||
glm::vec3 target = glm::vec3(0.0f, 0.5f, 0.0f);
|
||||
glm::mat4 lightView = glm::lookAt(t.position, target, glm::vec3(0.0f, 1.0f, 0.0f));
|
||||
glm::mat4 lightProjection = glm::ortho(-6.0f, 6.0f, -6.0f, 6.0f, near_plane, far_plane);
|
||||
glm::mat4 lightProjection = glm::ortho(-6.0f, 6.0f, -6.0f, 6.0f, 1.0f, 20.0f);
|
||||
glm::mat4 lightSpaceMatrix = lightProjection * lightView;
|
||||
|
||||
m_depthShader.setMat4("u_lightSpace", lightSpaceMatrix);
|
||||
@ -237,6 +234,8 @@ void Renderer::Render() {
|
||||
|
||||
RenderScene(m_depthShader);
|
||||
|
||||
// glDisable(GL_POLYGON_OFFSET_FILL);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
}
|
||||
|
||||
@ -246,7 +245,7 @@ void Renderer::Render() {
|
||||
glViewport(0, 0, Window::GetWidth(), Window::GetHeight());
|
||||
glClearColor(0x18/255.0f, 0x18/255.0f, 0x18/255.0f, 1);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
|
||||
m_shader.use();
|
||||
ApplyLights(m_shader);
|
||||
UpdateView();
|
||||
|
@ -35,9 +35,9 @@ public:
|
||||
m_registry.emplace<transform>(cameraEntity, glm::vec3(0.f, 2.f, 2.f));
|
||||
m_registry.emplace<camera>(cameraEntity);
|
||||
|
||||
Object* targetObj = Object::LoadFile("./assets/wizard/wizard.obj");
|
||||
Object* targetObj = Object::LoadFile("./assets/car/car.obj");
|
||||
const auto targetEntity = m_registry.create();
|
||||
m_registry.emplace<transform>(targetEntity, glm::vec3(0.f, 0.0f, 0.f), glm::vec3(0.f, 0.0f, 0.f), glm::vec3(0.5f, 0.5f, 0.5f));
|
||||
m_registry.emplace<transform>(targetEntity, glm::vec3(0.f, 0.0f, 0.f));
|
||||
m_registry.emplace<mesh>(targetEntity, std::shared_ptr<Object>(targetObj));
|
||||
m_registry.emplace<rotate>(targetEntity);
|
||||
|
||||
|
Reference in New Issue
Block a user