簡體   English   中英

OpenGL- glDrawElements僅繪制第一個元素

[英]OpenGL- glDrawElements only draws first element

大家好,我正在為我的游戲制作一個3D引擎,並為頂點數組和VBO創建了一個類。 在我嘗試向頂點數組添加索引之前一直有效。 現在,它僅繪制索引的第一個元素!

這是函數生成,生成VAO和VBO。

void build() {
vboID = new GLuint[vboS];

if (vertexIndexing) {
    for (int n = 0, m = 0, i = 0; n < vertexes.size(); m++) {
        if (i + m >= vertexes.size()) {
            break;
        }
        indices.push_back((GLushort)(i+m));
        if (m >= s) {
            m = 0;
            n++;
            i+=s/2;
            std::cout << "\n";
        }
        std::cout << i + m << " , ";
    }
    std::cout << "\n";
}

shader->use();

glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glGenBuffers(vboS, vboID);

if (vertexIndexing) {
    glGenBuffers(1, &IBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort), &indices[0], GL_STATIC_DRAW);
}

int n = 0;

if (options.vertex) {
    shader->addAttribute("vertex");
    glBindBuffer(GL_ARRAY_BUFFER, vboID[n]);
    glBufferData(GL_ARRAY_BUFFER, pos.size() * sizeof(GLfloat), &pos[0], GL_STATIC_DRAW);
    glVertexAttribPointer(shader->attribute("vertex"), 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(shader->attribute("vertex"));
    n++;
}

if (options.color) {
    shader->addAttribute("color");
    glBindBuffer(GL_ARRAY_BUFFER, vboID[n]);
    glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(GLfloat), &colors[0], GL_STATIC_DRAW);
    glVertexAttribPointer(shader->attribute("color"), 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(shader->attribute("color"));
    n++;
}

if (options.normal) {
    shader->addAttribute("normal");
    glBindBuffer(GL_ARRAY_BUFFER, vboID[n]);
    glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(GLfloat), &normals[0], GL_STATIC_DRAW);
    glVertexAttribPointer(shader->attribute("normal"), 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(shader->attribute("normal"));
    n++;
}

if (options.texcoord) {
    shader->addAttribute("texcoord");
    glBindBuffer(GL_ARRAY_BUFFER, vboID[n]);
    glBufferData(GL_ARRAY_BUFFER, texcoords.size() * sizeof(GLfloat), &texcoords[0], GL_STATIC_DRAW);
    glVertexAttribPointer(shader->attribute("texcoord"), 2, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(shader->attribute("texcoord"));
    n++;
}
glBindVertexArray(0);
shader->disable();

}

這是繪制VAO的函數繪制。

void draw() {
glBindVertexArray(vaoID);
if (vertexIndexing) {
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
    shader->use();
    glDrawElements(mode, indices.size(), GL_UNSIGNED_SHORT, 0);
    shader->disable();
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
else {
    shader->use();
    glDrawArrays(mode, 0, vertexes.size());
    shader->disable();
}
glBindVertexArray(0);

}

注意:我刪除了glEnableClientState(GL_VERTEX_ARRAY),因為它沒有做任何事情。

好,我把它修好了。 這不是openGL的問題。 正是隨着指數的產生。

新指數的產生:

for (int n = 0, m = 0, i = 0; n < vertexes.size(); m++) {
    if (i + m >= vertexes.size()) {
        break;
    }
    if (m >= s) {
        m = 0;
        n++;
        i+=s/2;
    }
    indices.push_back((GLushort)(i + m));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM