I have been following the LearnOpenGL Hello Triangle tutorial, and nothing is rendering except the clear color.
Any help finding what is wrong would be appreciated.
Using LWJGL 3.2.3 OpenGL and GLFW bindings on MacOS.
My code:
// ---- WINDOW SETUP ----------------------------------
glfwInit();
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
long window = glfwCreateWindow(WIDTH, HEIGHT, TITLE, NULL, NULL);
if (window == NULL) throw new IllegalStateException("Could not create window");
glfwMakeContextCurrent(window);
GL.createCapabilities();
int[] fbWidth = new int[1];
int[] fbHeight = new int[1];
glfwGetFramebufferSize(window, fbWidth, fbHeight);
glViewport(0, 0, fbWidth[0], fbHeight[0]);
log.info("Framebuffer size: {} x {}", fbWidth[0], fbHeight[0]);
glfwShowWindow(window);
log.info("Created window");
// ---- BUFFER SETUP ----------------------------------
float[] vertices = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
int vao = glGenBuffers();
glBindVertexArray(vao);
int vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0L);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
log.info("Created buffers");
// ---- SHADER SETUP ----------------------------------
String vertexShaderSource =
"#version 330 core\n" +
"layout(location = 0) in vec3 aPos;\n" +
"void main() {\n" +
" gl_Position = vec4(aPos, 1.0);\n" +
"}";
String fragmentShaderSource =
"#version 330 core\n" +
"out vec4 fragColor;\n" +
"void main() {\n" +
" fragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" +
"}";
int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, vertexShaderSource);
glCompileShader(vertexShader);
if (glGetShaderi(vertexShader, GL_COMPILE_STATUS) == GL_FALSE) {
log.error("Vertex shader compilation failed:");
log.error(glGetShaderInfoLog(vertexShader));
return;
}
int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, fragmentShaderSource);
glCompileShader(fragmentShader);
if (glGetShaderi(fragmentShader, GL_COMPILE_STATUS) == GLFW_FALSE) {
log.error("Fragment shader compilation failed:");
log.error(glGetShaderInfoLog(fragmentShader));
return;
}
int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
if (glGetProgrami(shaderProgram, GL_LINK_STATUS) == GL_FALSE) {
log.error("Shader program linking failed:");
log.error(glGetProgramInfoLog(shaderProgram));
return;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
log.info("Loaded shaders");
// ---- MAIN LOOP ------------------------------------
while (!glfwWindowShouldClose(window)) {
glClearColor(0.1f, 0.2f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glfwSwapBuffers(window);
glfwPollEvents();
}
// ---- CLEANUP --------------------------------------
glDeleteProgram(shaderProgram);
glDeleteBuffers(vbo);
glDeleteVertexArrays(vao);
glfwDestroyWindow(window);
glfwTerminate();
3 * sizeof(float)
, not 0 inglVertexAttribPointer
. \$\endgroup\$