我正在尝试制作我自己的opengl引擎用于学习目的,我正在使用glfw3,glew和assimp . 到目前为止,我可以从文件加载模型并在屏幕上显示它们 . 它还可以从文件中读取和编译着色器 . 当我尝试使用着色器绘制网格时,它会消失,但如果我不使用着色器,它会显示正常 . 我认为我的问题可能是当我将网格数据绑定到VBO和VAO时 . 它也可能是我加载它的方式

这是我的Shader加载功能:

Shader::Shader(string vertex_path, string fragment_path) {
    Shader::success = false;

    string vertex, fragment;

    vertex = file_read_all(vertex_path);
    fragment = file_read_all(fragment_path);

    const GLchar *verCode = vertex.c_str();
    const GLchar *fraCode = fragment.c_str();

    GLuint verShader, fraShader;

    GLint success;
    GLchar log[512];

    verShader = glCreateShader(GL_VERTEX_SHADER);

    glShaderSource(verShader, 1 , &verCode, NULL);
    glCompileShader(verShader);

    glGetShaderiv(verShader, GL_COMPILE_STATUS, &success);

    if (!success) {
        glGetShaderInfoLog(verShader, 512, NULL, log);

        cout << "Failed to Compile Vertex Shader " << vertex_path << "!" << endl << log;
        return;
    }

    fraShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(fraShader, 1, &fraCode, NULL);
    glCompileShader(fraShader);

    glGetShaderiv(fraShader, GL_COMPILE_STATUS, &success);

    if (!success) {
        glGetShaderInfoLog(fraShader, 512, NULL, log);

        cout << "Failed to Compile Vertex Shader " << fragment_path << "!" << endl << log;
        return;
    }

    Shader::shader_id = glCreateProgram();

    glAttachShader(Shader::shader_id, verShader);
    glAttachShader(Shader::shader_id, fraShader);

    glLinkProgram(Shader::shader_id);

    glGetShaderiv(Shader::shader_id, GL_LINK_STATUS, &success);

    glDeleteShader(verShader);
    glDeleteShader(fraShader);

    if (!success) {
        glGetShaderInfoLog(Shader::shader_id, 512, NULL, log);

        cout << "Failed to Link Shaders " << vertex_path << " and " << fragment_path << "!" << endl << log;
        return;
    }

    Shader::success = true;
    }

这是我的Vertex Shader程序:

#version 330 core
layout (location = 0) in vec3 position;

uniform mat4 view;

void main()
{
    gl_Position = view * vec4(position, 1.0f);
}

这是我的函数,它将网格数据绑定到VBO的/ VAO:

void Mesh::bind(vector<float> vertex, vector<float> normal, vector<GLuint> indices) {
    glGenVertexArrays(1, &this->VAO);
    glGenBuffers(1, &this->VBO);
    glGenBuffers(1, &this->EBO);

    glBindVertexArray(this->VAO);

    glBindBuffer(GL_ARRAY_BUFFER, this->VBO);

    glBufferData(GL_ARRAY_BUFFER, vertex.size() * sizeof(float), &vertex[0], GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), &indices[0], GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex.size() * sizeof(float), 0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, normal.size() * sizeof(float), 0);

    glBindVertexArray(0);

}

这是绘制我的网格的代码:

void Mesh::Draw() {
    glBindVertexArray(this->VAO);
    glDrawArrays(GL_TRIANGLES, 0, this->count);
}

这是我加载和处理网格的函数:

Mesh::Mesh(string path) {
    Assimp::Importer importer;

    const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_JoinIdenticalVertices);

    this->process(scene);
}

void Mesh::process(const aiScene* scene) {
    vector<float> vertex, normal;
    vector<GLuint> indeces;

    this->count = 0;

    if (scene->HasMeshes()) {
        this->loaded = true;
        for (int i = 0; i != scene->mNumMeshes; i++) {
            for (int ii = 0; ii != scene->mMeshes[i]->mNumVertices; ii++) {
                vertex.push_back(scene->mMeshes[i]->mVertices[ii].x);
                vertex.push_back(scene->mMeshes[i]->mVertices[ii].y);
                vertex.push_back(scene->mMeshes[i]->mVertices[ii].z);

                normal.push_back(scene->mMeshes[i]->mNormals[ii].x);
                normal.push_back(scene->mMeshes[i]->mNormals[ii].y);
                normal.push_back(scene->mMeshes[i]->mNormals[ii].z);

                this->count++;
            }
            for (int ii = 0; ii != scene->mMeshes[i]->mNumFaces; ii++) {
                for (int iii = 0; iii != scene->mMeshes[i]->mFaces[ii].mNumIndices; iii++) {
                    indeces.push_back(scene->mMeshes[i]->mFaces[ii].mIndices[iii]);
                    indeces.push_back(scene->mMeshes[i]->mFaces[ii].mIndices[iii]);
                    indeces.push_back(scene->mMeshes[i]->mFaces[ii].mIndices[iii]);
                    this->indice_count++;
                }
            }
        }
    }
    this->vertex_count = this->count;
    this->bind(vertex, normal, indeces);
}