blob: dd309321bc161b540f1eece836ef4476f795c967 [file] [log] [blame] [edit]
// Copyright (c) 2015, the Dart GL extension authors. All rights reserved.
// Please see the AUTHORS file for details. Use of this source code is governed
// by a BSD-style license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "third_party/GL/GLFW/include/GLFW/glfw3.h"
GLuint vbo;
GLuint v_shader, f_shader, shader_program;
const float verts[] = {-1.0, -1.0, 0.0, 1.0, 1.0, -1.0,
0.0, 1.0, 0.0, 1.0, 0.0, 1.0};
const GLchar vs[] =
"#version 100\n"
"in vec4 position;\n"
"void main() {\n"
" gl_Position = position;\n"
"}\n";
const GLchar fs[] =
"#version 100\n"
"void main() {\n"
" gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
"}\n";
void check_error() {
GLenum err;
while ((err = glGetError()) != GL_NO_ERROR) {
fprintf(stderr, "OpenGL error: %d\n", err);
}
}
void get_shader_error(GLuint shader) {
GLint infoLogLength;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
GLchar *strInfoLog = (GLchar *)malloc(infoLogLength + 1);
glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
fprintf(stderr, "%d\n", infoLogLength);
fprintf(stderr, "Compile failure in shader:\n%s\n", strInfoLog);
}
void setup_buffers() {
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (void *)NULL);
}
void setup_shaders() {
v_shader = glCreateShader(GL_VERTEX_SHADER);
f_shader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar *vshader_text = strdup(vs);
const GLchar *fshader_text = strdup(fs);
glShaderSource(v_shader, 1, &vshader_text, NULL);
glShaderSource(f_shader, 1, &fshader_text, NULL);
glCompileShader(v_shader);
glCompileShader(f_shader);
shader_program = glCreateProgram();
glAttachShader(shader_program, v_shader);
glAttachShader(shader_program, f_shader);
glLinkProgram(shader_program);
glUseProgram(shader_program);
}
void render_triangle() {
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (void *)NULL);
glUseProgram(shader_program);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
int main() {
GLFWwindow *window;
if (!glfwInit()) {
return -1;
}
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
window = glfwCreateWindow(1280, 720, "Example triangle.", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
printf("%s\n", glGetString(GL_VERSION));
setup_buffers();
setup_shaders();
glViewport(0, 0, 1280, 720);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
render_triangle();
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}