glDrawArrays不能在我的Voxel引擎上运行

时间:2017-06-16 08:14:01

标签: c++ opengl

我的体素引擎块不会因某些奇怪的原因而被绘制。我在RenderDoc中调试过,一切似乎都很好。我开始认为我设置我的功能有些不对劲。

以下是代码:

void Chunk::createMesh() // called once, right before the render loop
{
    int i = 0;
    this->shader.loadShader("chunk.vs", "chunk.fs");

    for (int x = 0; x < CHUNK_SIZE; x++) 
    {
        for (int y = 0; y < CHUNK_HEIGHT; y++)
        {
            for (int z = 0; z < CHUNK_SIZE; z++)
            {
                GLuint currentBlock = this->blockCur[x][y][z];

                this->vertex[i++] = byte4(x, y, z, currentBlock);
                this->vertex[i++] = byte4(x, y, z + 1, currentBlock);
                this->vertex[i++] = byte4(x, y + 1, z, currentBlock);
                this->vertex[i++] = byte4(x, y + 1, z, currentBlock);
                this->vertex[i++] = byte4(x, y, z + 1, currentBlock);
                this->vertex[i++] = byte4(x, y + 1, z + 1, currentBlock);

                // View from positive x
                this->vertex[i++] = byte4(x + 1, y, z, currentBlock);
                this->vertex[i++] = byte4(x + 1, y + 1, z, currentBlock);
                this->vertex[i++] = byte4(x + 1, y, z + 1, currentBlock);
                this->vertex[i++] = byte4(x + 1, y + 1, z, currentBlock);
                this->vertex[i++] = byte4(x + 1, y + 1, z + 1, currentBlock);
                this->vertex[i++] = byte4(x + 1, y, z + 1, currentBlock);

                currentBlock++;
            }
        }
    }

    this->elements = i;

    glGenVertexArrays(1, &this->vao);

    glBindVertexArray(this->vao);
    glGenBuffers(1, &this->vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, this->elements * sizeof(this->vertex), this->vertex, GL_STATIC_DRAW);

    glGenBuffers(1, &cubeColor);
    glBindBuffer(GL_ARRAY_BUFFER, cubeColor);
    glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW);


    this->attribCoord3dChunk = glGetAttribLocation(this->shader.program, "coord3d");
    this->attribMVPChunk = glGetUniformLocation(this->shader.program, "mvp");
    this->attribColor = glGetUniformLocation(this->shader.program, "f_color");

    if (this->attribCoord3dChunk < 0)
    {
        std::cout << "attribCoord3dChunk was negative!" << std::endl;
    }

    std::cout << this->attribMVPChunk << std::endl;

    glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
    glVertexAttribPointer(
        this->attribCoord3dChunk, // attribute
        3,                 // number of elements per vertex, here (R,G,B)
        GL_FLOAT,          // the type of each element
        GL_FALSE,          // take our values as-is
        0,                 // no extra data between each position
        (GLvoid*)0                  // offset of first element
    );
    glEnableVertexAttribArray(this->attribCoord3dChunk);

    glBindBuffer(GL_ARRAY_BUFFER, this->chunkColor);
    glVertexAttribPointer(
        this->attribColor, // attribute
        3,                 // number of elements per vertex, here (x,y,z)
        GL_FLOAT,          // the type of each element
        GL_FALSE,          // take our values as-is
        0,                 // no extra data between each position
        (GLvoid*)0                  // offset of first element
    );
    glEnableVertexAttribArray(this->attribColor);

    glBindVertexArray(0);

    this->loaded = true;
}

void Chunk::render() // called every frame
{
    glBindVertexArray(this->vao);
    glEnableVertexAttribArray(this->attribCoord3dChunk);
    model = glm::translate(glm::mat4(1.0f), glm::vec3(1, 1, 1));
    glm::mat4 mvp = gameManager->projection * gameManager->view * model;
    glUniformMatrix4fv(this->attribMVPChunk, 1, GL_FALSE, glm::value_ptr(mvp));

    glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
    glDrawArrays(GL_TRIANGLES, 0, this->elements);
    glDisableVertexAttribArray(this->attribCoord3dChunk);
    glBindVertexArray(0);
}

其中byte4的typedef为

typedef glm::tvec4<GLbyte> byte4;

我在渲染循环之前调用createMesh一次。 我还在每一帧都调用渲染。

1 个答案:

答案 0 :(得分:-1)

固定!目前的代码:

/proc
相关问题