Projektion bei Resize #33

Closed
opened 2026-04-17 04:45:40 +00:00 by sebastian · 0 comments
Owner

Problem: MasterRenderer berechnet die Projektionsmatrix einmalig beim Start mit der initialen Fenstergröße und gibt sie fest an Renderer und WorldSpriteRenderer weiter. glViewport wird im GLFW-Callback korrekt aktualisiert – die Projektionsmatrix nicht. Bei Fenstergrößenänderung stimmt das Aspect Ratio nicht mehr und 3D-Objekte werden verzerrt.
Ursache:

// MasterRenderer.cpp – einmalig bei Konstruktion:
glm::mat4 proj = createProjectionMatrix();  // liest aktuelle Fenstergröße
entityRenderer = std::make_unique<Renderer>(proj);  // fest verdrahtet

Lösung: Projektionsmatrix nicht im Konstruktor speichern, sondern jedes Frame neu berechnen (ist günstig – nur wenig Mathematik):

// MasterRenderer.cpp:
void MasterRenderer::render(const Light& light, const Camera& camera) {
    glm::mat4 proj = createProjectionMatrix();  // jedes Frame, nicht im Konstruktor
    entityRenderer->prepare(camera, light, proj);
    worldSpriteRenderer->prepare(camera, proj);
    // ...
}

Alternativ: WindowResizeEvent über EventBus feuern (bereits als TODO im GLFW-Callback kommentiert) und MasterRenderer abonniert das Event.
Acceptance Criteria:

  • Nach Window-Resize bleibt das Aspect Ratio korrekt
  • 3D-Objekte werden nicht verzerrt wenn das Fenster vergrößert/verkleinert wird
  • TextRenderer ist bereits korrekt (berechnet Projektion per Frame) – dient als Referenz
Problem: MasterRenderer berechnet die Projektionsmatrix einmalig beim Start mit der initialen Fenstergröße und gibt sie fest an Renderer und WorldSpriteRenderer weiter. glViewport wird im GLFW-Callback korrekt aktualisiert – die Projektionsmatrix nicht. Bei Fenstergrößenänderung stimmt das Aspect Ratio nicht mehr und 3D-Objekte werden verzerrt. Ursache: ``` // MasterRenderer.cpp – einmalig bei Konstruktion: glm::mat4 proj = createProjectionMatrix(); // liest aktuelle Fenstergröße entityRenderer = std::make_unique<Renderer>(proj); // fest verdrahtet ``` Lösung: Projektionsmatrix nicht im Konstruktor speichern, sondern jedes Frame neu berechnen (ist günstig – nur wenig Mathematik): ``` // MasterRenderer.cpp: void MasterRenderer::render(const Light& light, const Camera& camera) { glm::mat4 proj = createProjectionMatrix(); // jedes Frame, nicht im Konstruktor entityRenderer->prepare(camera, light, proj); worldSpriteRenderer->prepare(camera, proj); // ... } ``` Alternativ: WindowResizeEvent über EventBus feuern (bereits als TODO im GLFW-Callback kommentiert) und MasterRenderer abonniert das Event. Acceptance Criteria: - Nach Window-Resize bleibt das Aspect Ratio korrekt - 3D-Objekte werden nicht verzerrt wenn das Fenster vergrößert/verkleinert wird - TextRenderer ist bereits korrekt (berechnet Projektion per Frame) – dient als Referenz
sebastian added this to the RenderSystem Refactoring milestone 2026-04-17 04:45:40 +00:00
sebastian added the
bug
engine
labels 2026-04-17 04:45:40 +00:00
sebastian added this to the Dicewars project 2026-04-17 04:45:40 +00:00
Sign in to join this conversation.
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: sebastian/Dicewars-Siedler#33
No description provided.