我刚刚开始学习OpenGL,但遇到了麻烦:三角形没有渲染。我知道OpenGL在提供错误方面不是很好,但是经过几个小时的尝试后,我在下面的代码中找不到问题。我已经发表了很多评论,以防万一我以错误的顺序执行了某些操作。我还确保了着色器代码正确编译。
#include<glew.h>
#include<glfw3.h>
#include<iostream>
#include<string>
#include"FileReader.h"
void GetInput(GLFWwindow* window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window, true);
}
}
int main() {
//vertex buffer data. I know it's spelled wrong.
float vertexes[9]{
-0.5f, -0.5f, 1.0f,
0.0f, 0.5f, 1.0f,
0.5f, -0.5f, 1.0f
};
//index buffer data. I know it's spelled wrong.
unsigned int indexes[3]{
0, 1, 2
};
//start glfw
if (!glfwInit()) {
std::cout << "[Fatal Error]Could not start GLFW" << std::endl;
return -1;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
GLFWwindow* window = glfwCreateWindow(800, 600, "New Window", NULL, NULL);
glfwMakeContextCurrent(window);
//start glew
if (glewInit() != GLEW_OK) {
std::cout << "[Fatal Error]Failed to start GLEW" << std::endl;
glfwTerminate();
return -1;
}
//create vertex buffer
unsigned int VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), &vertexes, GL_STATIC_DRAW);
//enable layout
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * sizeof(float), 0);
//create index buffer
unsigned int IBO;
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 1);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * sizeof(unsigned int), &indexes, GL_STATIC_DRAW);
//store the vertex Shader source so it won't be deleted
std::string storeS = readfile("res\\basic.shader", "VertexShader").c_str();
const char* source = storeS.c_str();
//make vertex shader
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &source, NULL);
glCompileShader(vertexShader);
//store the fragment Shader source so it won't be deleted
std::string storeS2 = readfile("res\\basic.shader", "FragmentShader").c_str();
source = storeS2.c_str();
//make fragment shader
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &source, NULL);
glCompileShader(fragmentShader);
//create program
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
//attach shaders to program
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
//render loop
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &indexes);
GetInput(window);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
因为已绑定GL_ELEMENT_ARRAY_BUFFER
,所以glDrawElements
中的最后一个参数指定了绑定缓冲区内的偏移量。相应地,它应该为零,而不是一些大的指针值:
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);