OpenGL 中的线条渲染不绘制内部顶点

问题描述 投票:0回答:1

我正在尝试创建一个用于显示自定义 b2Body 形状的顶点的函数(我正在使用 Box2D 并尝试显示 Box2D 碰撞器),这就是我正在使用的函数。它渲染线和点来表示 b2Body 形状中顶点的位置。但它不会渲染形状“内部”的顶点,这意味着如果一个顶点比其他两个顶点更靠近中心,那么它只会渲染这两个顶点之间的一条线,而不渲染“内部”的顶点。那么,如何渲染形状的内部呢?如果你想知道,我的线顶点着色器只有三个 mat4,片段着色器只有一种颜色,非常简单。

#include <box2d/box2d.h>
#include <glm/glm.hpp>
#include <vector>
#include <glad/glad.h>

std::vector<glm::vec2> vertices;

// Iterate over all fixtures in the object's Box2D body and put the collider vertices in the vertices vector
for (b2Fixture* f = object.body->GetFixtureList(); f; f = f->GetNext()) {
    if (f->GetType() == b2Shape::e_polygon) {
        b2PolygonShape* shape = (b2PolygonShape*)f->GetShape();
        for (int i = 0; i < shape->m_count; ++i) {
            b2Vec2 vertex = object.body->GetWorldPoint(shape->m_vertices[i]);
            vertices.push_back(glm::vec2(vertex.x, vertex.y));
        }
    }
}

// Create and bind VAO and VBO
GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec2), vertices.data(), GL_STATIC_DRAW);

// Define vertex attribute
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec2), (void*)0);
glEnableVertexAttribArray(0);

// Use the shader program
shader.use();

// Set shader uniforms
shader.setMat4("view", view);
shader.setMat4("projection", projection);
shader.setVec4("lineColor", glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));

glm::mat4 model = glm::mat4(1.0f);
shader.setMat4("model", model);

// Draw the polygon outline
glLineWidth(2.0f);
glDrawArrays(GL_LINE_LOOP, 0, vertices.size());

// Draw points to highlight the vertices
glPointSize(10.0f);  
glDrawArrays(GL_POINTS, 0, vertices.size());

// Unbind and delete VAO and VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glDeleteBuffers(1, &VBO);
glDeleteVertexArrays(1, &VAO);
c++ opengl box2d
1个回答
0
投票

事实证明,顶点向量中的顶点数据是错误的。 Box2D 不支持凹面碰撞器,这就是顶点在线条渲染中显示奇怪的原因。线条渲染完全没有问题

© www.soinside.com 2019 - 2024. All rights reserved.