我正在尝试制作我自己的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);
}