It's friday....
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/out/
|
||||
20
Makefile
20
Makefile
@@ -3,11 +3,25 @@
|
||||
#
|
||||
# @file
|
||||
# @version 0.1
|
||||
CC = g++
|
||||
CFLAGS = -Wall
|
||||
LIBS = -lglfw -lGLESv2 -lm -lGL -lGLEW -ldl
|
||||
INCL = ./include
|
||||
DEPS = gl_utils.cpp glad.c
|
||||
EXE = pog
|
||||
|
||||
|
||||
all: build run
|
||||
|
||||
build: $(EXE).cpp $(DEPS)
|
||||
$(CC) $(CFLAGS) $^ $(LIBS) -I$(INCL) -o ./out/$(EXE)
|
||||
|
||||
debug: $(EXE).cpp $(DEPS)
|
||||
$(CC) -g $(CFLAGS) $^ $(LIBS) -I$(INCL) -o ./out/$(EXE)-debug
|
||||
|
||||
build:
|
||||
g++ -o ./out/pog pog.cpp -lglfw -lGLESv2 -lm -lGL
|
||||
run: build
|
||||
./out/pog
|
||||
|
||||
|
||||
gdb: debug
|
||||
gdb ./out/debug
|
||||
# end
|
||||
|
||||
6
fragment_shader.glsl
Normal file
6
fragment_shader.glsl
Normal file
@@ -0,0 +1,6 @@
|
||||
#version 330 core
|
||||
out vec4 FragColor;
|
||||
void main()
|
||||
{
|
||||
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
|
||||
}
|
||||
191
gl_utils.cpp
Normal file
191
gl_utils.cpp
Normal file
@@ -0,0 +1,191 @@
|
||||
/******************************************************************************\
|
||||
| OpenGL 4 Example Code. |
|
||||
| Accompanies written series "Anton's OpenGL 4 Tutorials" |
|
||||
| Email: anton at antongerdelan dot net |
|
||||
| First version 27 Jan 2014 |
|
||||
| Dr Anton Gerdelan, Trinity College Dublin, Ireland. |
|
||||
| See individual libraries separate legal notices |
|
||||
|******************************************************************************|
|
||||
| This is just a file holding some commonly-used "utility" functions to keep |
|
||||
| the main file a bit easier to read. You can might build up something like |
|
||||
| this as learn more GL. Note that you don't need much code here to do good GL.|
|
||||
| If you have a big object-oriented engine then maybe you can ask yourself if |
|
||||
| it is really making life easier. |
|
||||
\******************************************************************************/
|
||||
#include "include/gl_utils.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#define GL_LOG_FILE "gl.log"
|
||||
#define MAX_SHADER_LENGTH 262144
|
||||
|
||||
/*--------------------------------LOG FUNCTIONS-------------------------------*/
|
||||
bool restart_gl_log() {
|
||||
FILE* file = fopen( GL_LOG_FILE, "w" );
|
||||
if ( !file ) {
|
||||
fprintf( stderr, "ERROR: could not open GL_LOG_FILE log file %s for writing\n", GL_LOG_FILE );
|
||||
return false;
|
||||
}
|
||||
time_t now = time( NULL );
|
||||
char* date = ctime( &now );
|
||||
fprintf( file, "GL_LOG_FILE log. local time %s\n", date );
|
||||
fclose( file );
|
||||
return true;
|
||||
}
|
||||
|
||||
bool gl_log( const char* message, ... ) {
|
||||
va_list argptr;
|
||||
FILE* file = fopen( GL_LOG_FILE, "a" );
|
||||
if ( !file ) {
|
||||
fprintf( stderr, "ERROR: could not open GL_LOG_FILE %s file for appending\n", GL_LOG_FILE );
|
||||
return false;
|
||||
}
|
||||
va_start( argptr, message );
|
||||
vfprintf( file, message, argptr );
|
||||
va_end( argptr );
|
||||
fclose( file );
|
||||
return true;
|
||||
}
|
||||
|
||||
/* same as gl_log except also prints to stderr */
|
||||
bool gl_log_err( const char* message, ... ) {
|
||||
va_list argptr;
|
||||
FILE* file = fopen( GL_LOG_FILE, "a" );
|
||||
if ( !file ) {
|
||||
fprintf( stderr, "ERROR: could not open GL_LOG_FILE %s file for appending\n", GL_LOG_FILE );
|
||||
return false;
|
||||
}
|
||||
va_start( argptr, message );
|
||||
vfprintf( file, message, argptr );
|
||||
va_end( argptr );
|
||||
va_start( argptr, message );
|
||||
vfprintf( stderr, message, argptr );
|
||||
va_end( argptr );
|
||||
fclose( file );
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void glfw_error_callback( int error, const char* description ) {
|
||||
fputs( description, stderr );
|
||||
gl_log_err( "%s\n", description );
|
||||
}
|
||||
|
||||
|
||||
void _update_fps_counter( GLFWwindow* window ) {
|
||||
static double previous_seconds = glfwGetTime();
|
||||
static int frame_count;
|
||||
double current_seconds = glfwGetTime();
|
||||
double elapsed_seconds = current_seconds - previous_seconds;
|
||||
if ( elapsed_seconds > 0.25 ) {
|
||||
previous_seconds = current_seconds;
|
||||
double fps = (double)frame_count / elapsed_seconds;
|
||||
char tmp[128];
|
||||
sprintf( tmp, "opengl @ fps: %.2f", fps );
|
||||
glfwSetWindowTitle( window, tmp );
|
||||
frame_count = 0;
|
||||
}
|
||||
frame_count++;
|
||||
}
|
||||
|
||||
/*-----------------------------------SHADERS----------------------------------*/
|
||||
/* copy a shader from a plain text file into a character array */
|
||||
bool parse_file_into_str( const char* file_name, char* shader_str, int max_len ) {
|
||||
FILE* file = fopen( file_name, "r" );
|
||||
if ( !file ) {
|
||||
gl_log_err( "ERROR: opening file for reading: %s\n", file_name );
|
||||
return false;
|
||||
}
|
||||
size_t cnt = fread( shader_str, 1, max_len - 1, file );
|
||||
if ( (int)cnt >= max_len - 1 ) { gl_log_err( "WARNING: file %s too big - truncated.\n", file_name ); }
|
||||
if ( ferror( file ) ) {
|
||||
gl_log_err( "ERROR: reading shader file %s\n", file_name );
|
||||
fclose( file );
|
||||
return false;
|
||||
}
|
||||
// append \0 to end of file string
|
||||
shader_str[cnt] = 0;
|
||||
fclose( file );
|
||||
return true;
|
||||
}
|
||||
|
||||
void print_shader_info_log( GLuint shader_index ) {
|
||||
int max_length = 2048;
|
||||
int actual_length = 0;
|
||||
char log[2048];
|
||||
glGetShaderInfoLog( shader_index, max_length, &actual_length, log );
|
||||
printf( "shader info log for GL index %i:\n%s\n", shader_index, log );
|
||||
gl_log( "shader info log for GL index %i:\n%s\n", shader_index, log );
|
||||
}
|
||||
|
||||
bool create_shader( const char* file_name, GLuint* shader, GLenum type ) {
|
||||
gl_log( "creating shader from %s...\n", file_name );
|
||||
char shader_string[MAX_SHADER_LENGTH];
|
||||
parse_file_into_str( file_name, shader_string, MAX_SHADER_LENGTH );
|
||||
*shader = glCreateShader( type );
|
||||
const GLchar* p = (const GLchar*)shader_string;
|
||||
glShaderSource( *shader, 1, &p, NULL );
|
||||
glCompileShader( *shader );
|
||||
// check for compile errors
|
||||
int params = -1;
|
||||
glGetShaderiv( *shader, GL_COMPILE_STATUS, ¶ms );
|
||||
if ( GL_TRUE != params ) {
|
||||
gl_log_err( "ERROR: GL shader index %i did not compile\n", *shader );
|
||||
print_shader_info_log( *shader );
|
||||
return false; // or exit or something
|
||||
}
|
||||
gl_log( "shader compiled. index %i\n", *shader );
|
||||
return true;
|
||||
}
|
||||
|
||||
void print_programme_info_log( GLuint sp ) {
|
||||
int max_length = 2048;
|
||||
int actual_length = 0;
|
||||
char log[2048];
|
||||
glGetProgramInfoLog( sp, max_length, &actual_length, log );
|
||||
printf( "program info log for GL index %u:\n%s", sp, log );
|
||||
gl_log( "program info log for GL index %u:\n%s", sp, log );
|
||||
}
|
||||
|
||||
bool is_programme_valid( GLuint sp ) {
|
||||
glValidateProgram( sp );
|
||||
GLint params = -1;
|
||||
glGetProgramiv( sp, GL_VALIDATE_STATUS, ¶ms );
|
||||
if ( GL_TRUE != params ) {
|
||||
gl_log_err( "program %i GL_VALIDATE_STATUS = GL_FALSE\n", sp );
|
||||
print_programme_info_log( sp );
|
||||
return false;
|
||||
}
|
||||
gl_log( "program %i GL_VALIDATE_STATUS = GL_TRUE\n", sp );
|
||||
return true;
|
||||
}
|
||||
|
||||
bool create_programme( GLuint vert, GLuint frag, GLuint* programme ) {
|
||||
*programme = glCreateProgram();
|
||||
gl_log( "created programme %u. attaching shaders %u and %u...\n", *programme, vert, frag );
|
||||
glAttachShader( *programme, vert );
|
||||
glAttachShader( *programme, frag );
|
||||
// link the shader programme. if binding input attributes do that before link
|
||||
glLinkProgram( *programme );
|
||||
GLint params = -1;
|
||||
glGetProgramiv( *programme, GL_LINK_STATUS, ¶ms );
|
||||
if ( GL_TRUE != params ) {
|
||||
gl_log_err( "ERROR: could not link shader programme GL index %u\n", *programme );
|
||||
print_programme_info_log( *programme );
|
||||
return false;
|
||||
}
|
||||
( is_programme_valid( *programme ) );
|
||||
// delete shaders here to free memory
|
||||
glDeleteShader( vert );
|
||||
glDeleteShader( frag );
|
||||
return true;
|
||||
}
|
||||
|
||||
GLuint create_programme_from_files( const char* vert_file_name, const char* frag_file_name ) {
|
||||
GLuint vert, frag, programme;
|
||||
( create_shader( vert_file_name, &vert, GL_VERTEX_SHADER ) );
|
||||
( create_shader( frag_file_name, &frag, GL_FRAGMENT_SHADER ) );
|
||||
( create_programme( vert, frag, &programme ) );
|
||||
return programme;
|
||||
}
|
||||
186
hello_triangle.cpp
Normal file
186
hello_triangle.cpp
Normal file
@@ -0,0 +1,186 @@
|
||||
#include <EGL/egl.h>
|
||||
#include <GL/glew.h>
|
||||
#include <GL/glut.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
// #include <GLES2/gl2.h>
|
||||
#include "pog.h"
|
||||
#include <iostream>
|
||||
|
||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
|
||||
void processInput(GLFWwindow *window);
|
||||
|
||||
// settings
|
||||
const unsigned int SCR_WIDTH = 800;
|
||||
const unsigned int SCR_HEIGHT = 600;
|
||||
|
||||
const char *vertexShaderSource = "#version 330 core\n"
|
||||
"layout (location = 0) in vec3 aPos;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
|
||||
"}\0";
|
||||
const char *fragmentShaderSource = "#version 330 core\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
|
||||
"}\n\0";
|
||||
|
||||
int main()
|
||||
{
|
||||
// glfw: initialize and configure
|
||||
// ------------------------------
|
||||
glfwInit();
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
|
||||
#ifdef __APPLE__
|
||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||
#endif
|
||||
|
||||
// glfw window creation
|
||||
// --------------------
|
||||
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
|
||||
if (window == NULL)
|
||||
{
|
||||
std::cout << "Failed to create GLFW window" << std::endl;
|
||||
glfwTerminate();
|
||||
return -1;
|
||||
}
|
||||
glfwMakeContextCurrent(window);
|
||||
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||
|
||||
// glad: load all OpenGL function pointers
|
||||
// ---------------------------------------
|
||||
// if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
|
||||
// {
|
||||
// std::cout << "Failed to initialize GLAD" << std::endl;
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
|
||||
// build and compile our shader program
|
||||
// ------------------------------------
|
||||
// vertex shader
|
||||
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
|
||||
glCompileShader(vertexShader);
|
||||
// check for shader compile errors
|
||||
int success;
|
||||
char infoLog[512];
|
||||
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
|
||||
}
|
||||
// fragment shader
|
||||
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
|
||||
glCompileShader(fragmentShader);
|
||||
// check for shader compile errors
|
||||
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
|
||||
}
|
||||
// link shaders
|
||||
unsigned int shaderProgram = glCreateProgram();
|
||||
glAttachShader(shaderProgram, vertexShader);
|
||||
glAttachShader(shaderProgram, fragmentShader);
|
||||
glLinkProgram(shaderProgram);
|
||||
// check for linking errors
|
||||
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
|
||||
if (!success) {
|
||||
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
|
||||
}
|
||||
glDeleteShader(vertexShader);
|
||||
glDeleteShader(fragmentShader);
|
||||
|
||||
// set up vertex data (and buffer(s)) and configure vertex attributes
|
||||
// ------------------------------------------------------------------
|
||||
float vertices[] = {
|
||||
-0.5f, -0.5f, 0.0f, // left
|
||||
0.5f, -0.5f, 0.0f, // right
|
||||
0.0f, 0.5f, 0.0f // top
|
||||
};
|
||||
|
||||
unsigned int VBO, VAO;
|
||||
glGenVertexArrays(1, &VAO);
|
||||
glGenBuffers(1, &VBO);
|
||||
// bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).
|
||||
glBindVertexArray(VAO);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
||||
glEnableVertexAttribArray(0);
|
||||
|
||||
// note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbind
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
|
||||
// You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, but this rarely happens. Modifying other
|
||||
// VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs (nor VBOs) when it's not directly necessary.
|
||||
glBindVertexArray(0);
|
||||
|
||||
|
||||
// uncomment this call to draw in wireframe polygons.
|
||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
|
||||
// render loop
|
||||
// -----------
|
||||
while (!glfwWindowShouldClose(window))
|
||||
{
|
||||
// input
|
||||
// -----
|
||||
processInput(window);
|
||||
|
||||
// render
|
||||
// ------
|
||||
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
// draw our first triangle
|
||||
glUseProgram(shaderProgram);
|
||||
glBindVertexArray(VAO); // seeing as we only have a single VAO there's no need to bind it every time, but we'll do so to keep things a bit more organized
|
||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||
// glBindVertexArray(0); // no need to unbind it every time
|
||||
|
||||
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
|
||||
// -------------------------------------------------------------------------------
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
}
|
||||
|
||||
// optional: de-allocate all resources once they've outlived their purpose:
|
||||
// ------------------------------------------------------------------------
|
||||
glDeleteVertexArrays(1, &VAO);
|
||||
glDeleteBuffers(1, &VBO);
|
||||
glDeleteProgram(shaderProgram);
|
||||
|
||||
// glfw: terminate, clearing all previously allocated GLFW resources.
|
||||
// ------------------------------------------------------------------
|
||||
glfwTerminate();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
|
||||
// ---------------------------------------------------------------------------------------------------------
|
||||
void processInput(GLFWwindow *window)
|
||||
{
|
||||
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
|
||||
glfwSetWindowShouldClose(window, true);
|
||||
}
|
||||
|
||||
// glfw: whenever the window size changed (by OS or user resize) this callback function executes
|
||||
// ---------------------------------------------------------------------------------------------
|
||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||
{
|
||||
// make sure the viewport matches the new window dimensions; note that width and
|
||||
// height will be significantly larger than specified on retina displays.
|
||||
glViewport(0, 0, width, height);
|
||||
}
|
||||
290
include/KHR/khrplatform.h
Normal file
290
include/KHR/khrplatform.h
Normal file
@@ -0,0 +1,290 @@
|
||||
#ifndef __khrplatform_h_
|
||||
#define __khrplatform_h_
|
||||
|
||||
/*
|
||||
** Copyright (c) 2008-2018 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
/* Khronos platform-specific types and definitions.
|
||||
*
|
||||
* The master copy of khrplatform.h is maintained in the Khronos EGL
|
||||
* Registry repository at https://github.com/KhronosGroup/EGL-Registry
|
||||
* The last semantic modification to khrplatform.h was at commit ID:
|
||||
* 67a3e0864c2d75ea5287b9f3d2eb74a745936692
|
||||
*
|
||||
* Adopters may modify this file to suit their platform. Adopters are
|
||||
* encouraged to submit platform specific modifications to the Khronos
|
||||
* group so that they can be included in future versions of this file.
|
||||
* Please submit changes by filing pull requests or issues on
|
||||
* the EGL Registry repository linked above.
|
||||
*
|
||||
*
|
||||
* See the Implementer's Guidelines for information about where this file
|
||||
* should be located on your system and for more details of its use:
|
||||
* http://www.khronos.org/registry/implementers_guide.pdf
|
||||
*
|
||||
* This file should be included as
|
||||
* #include <KHR/khrplatform.h>
|
||||
* by Khronos client API header files that use its types and defines.
|
||||
*
|
||||
* The types in khrplatform.h should only be used to define API-specific types.
|
||||
*
|
||||
* Types defined in khrplatform.h:
|
||||
* khronos_int8_t signed 8 bit
|
||||
* khronos_uint8_t unsigned 8 bit
|
||||
* khronos_int16_t signed 16 bit
|
||||
* khronos_uint16_t unsigned 16 bit
|
||||
* khronos_int32_t signed 32 bit
|
||||
* khronos_uint32_t unsigned 32 bit
|
||||
* khronos_int64_t signed 64 bit
|
||||
* khronos_uint64_t unsigned 64 bit
|
||||
* khronos_intptr_t signed same number of bits as a pointer
|
||||
* khronos_uintptr_t unsigned same number of bits as a pointer
|
||||
* khronos_ssize_t signed size
|
||||
* khronos_usize_t unsigned size
|
||||
* khronos_float_t signed 32 bit floating point
|
||||
* khronos_time_ns_t unsigned 64 bit time in nanoseconds
|
||||
* khronos_utime_nanoseconds_t unsigned time interval or absolute time in
|
||||
* nanoseconds
|
||||
* khronos_stime_nanoseconds_t signed time interval in nanoseconds
|
||||
* khronos_boolean_enum_t enumerated boolean type. This should
|
||||
* only be used as a base type when a client API's boolean type is
|
||||
* an enum. Client APIs which use an integer or other type for
|
||||
* booleans cannot use this as the base type for their boolean.
|
||||
*
|
||||
* Tokens defined in khrplatform.h:
|
||||
*
|
||||
* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
|
||||
*
|
||||
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
|
||||
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
|
||||
*
|
||||
* Calling convention macros defined in this file:
|
||||
* KHRONOS_APICALL
|
||||
* KHRONOS_APIENTRY
|
||||
* KHRONOS_APIATTRIBUTES
|
||||
*
|
||||
* These may be used in function prototypes as:
|
||||
*
|
||||
* KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
|
||||
* int arg1,
|
||||
* int arg2) KHRONOS_APIATTRIBUTES;
|
||||
*/
|
||||
|
||||
#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
|
||||
# define KHRONOS_STATIC 1
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APICALL
|
||||
*-------------------------------------------------------------------------
|
||||
* This precedes the return type of the function in the function prototype.
|
||||
*/
|
||||
#if defined(KHRONOS_STATIC)
|
||||
/* If the preprocessor constant KHRONOS_STATIC is defined, make the
|
||||
* header compatible with static linking. */
|
||||
# define KHRONOS_APICALL
|
||||
#elif defined(_WIN32)
|
||||
# define KHRONOS_APICALL __declspec(dllimport)
|
||||
#elif defined (__SYMBIAN32__)
|
||||
# define KHRONOS_APICALL IMPORT_C
|
||||
#elif defined(__ANDROID__)
|
||||
# define KHRONOS_APICALL __attribute__((visibility("default")))
|
||||
#else
|
||||
# define KHRONOS_APICALL
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APIENTRY
|
||||
*-------------------------------------------------------------------------
|
||||
* This follows the return type of the function and precedes the function
|
||||
* name in the function prototype.
|
||||
*/
|
||||
#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
|
||||
/* Win32 but not WinCE */
|
||||
# define KHRONOS_APIENTRY __stdcall
|
||||
#else
|
||||
# define KHRONOS_APIENTRY
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APIATTRIBUTES
|
||||
*-------------------------------------------------------------------------
|
||||
* This follows the closing parenthesis of the function prototype arguments.
|
||||
*/
|
||||
#if defined (__ARMCC_2__)
|
||||
#define KHRONOS_APIATTRIBUTES __softfp
|
||||
#else
|
||||
#define KHRONOS_APIATTRIBUTES
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* basic type definitions
|
||||
*-----------------------------------------------------------------------*/
|
||||
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
|
||||
|
||||
|
||||
/*
|
||||
* Using <stdint.h>
|
||||
*/
|
||||
#include <stdint.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(__VMS ) || defined(__sgi)
|
||||
|
||||
/*
|
||||
* Using <inttypes.h>
|
||||
*/
|
||||
#include <inttypes.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||
|
||||
/*
|
||||
* Win32
|
||||
*/
|
||||
typedef __int32 khronos_int32_t;
|
||||
typedef unsigned __int32 khronos_uint32_t;
|
||||
typedef __int64 khronos_int64_t;
|
||||
typedef unsigned __int64 khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(__sun__) || defined(__digital__)
|
||||
|
||||
/*
|
||||
* Sun or Digital
|
||||
*/
|
||||
typedef int khronos_int32_t;
|
||||
typedef unsigned int khronos_uint32_t;
|
||||
#if defined(__arch64__) || defined(_LP64)
|
||||
typedef long int khronos_int64_t;
|
||||
typedef unsigned long int khronos_uint64_t;
|
||||
#else
|
||||
typedef long long int khronos_int64_t;
|
||||
typedef unsigned long long int khronos_uint64_t;
|
||||
#endif /* __arch64__ */
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif 0
|
||||
|
||||
/*
|
||||
* Hypothetical platform with no float or int64 support
|
||||
*/
|
||||
typedef int khronos_int32_t;
|
||||
typedef unsigned int khronos_uint32_t;
|
||||
#define KHRONOS_SUPPORT_INT64 0
|
||||
#define KHRONOS_SUPPORT_FLOAT 0
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Generic fallback
|
||||
*/
|
||||
#include <stdint.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Types that are (so far) the same on all platforms
|
||||
*/
|
||||
typedef signed char khronos_int8_t;
|
||||
typedef unsigned char khronos_uint8_t;
|
||||
typedef signed short int khronos_int16_t;
|
||||
typedef unsigned short int khronos_uint16_t;
|
||||
|
||||
/*
|
||||
* Types that differ between LLP64 and LP64 architectures - in LLP64,
|
||||
* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
|
||||
* to be the only LLP64 architecture in current use.
|
||||
*/
|
||||
#ifdef _WIN64
|
||||
typedef signed long long int khronos_intptr_t;
|
||||
typedef unsigned long long int khronos_uintptr_t;
|
||||
typedef signed long long int khronos_ssize_t;
|
||||
typedef unsigned long long int khronos_usize_t;
|
||||
#else
|
||||
typedef signed long int khronos_intptr_t;
|
||||
typedef unsigned long int khronos_uintptr_t;
|
||||
typedef signed long int khronos_ssize_t;
|
||||
typedef unsigned long int khronos_usize_t;
|
||||
#endif
|
||||
|
||||
#if KHRONOS_SUPPORT_FLOAT
|
||||
/*
|
||||
* Float type
|
||||
*/
|
||||
typedef float khronos_float_t;
|
||||
#endif
|
||||
|
||||
#if KHRONOS_SUPPORT_INT64
|
||||
/* Time types
|
||||
*
|
||||
* These types can be used to represent a time interval in nanoseconds or
|
||||
* an absolute Unadjusted System Time. Unadjusted System Time is the number
|
||||
* of nanoseconds since some arbitrary system event (e.g. since the last
|
||||
* time the system booted). The Unadjusted System Time is an unsigned
|
||||
* 64 bit value that wraps back to 0 every 584 years. Time intervals
|
||||
* may be either signed or unsigned.
|
||||
*/
|
||||
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
|
||||
typedef khronos_int64_t khronos_stime_nanoseconds_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Dummy value used to pad enum types to 32 bits.
|
||||
*/
|
||||
#ifndef KHRONOS_MAX_ENUM
|
||||
#define KHRONOS_MAX_ENUM 0x7FFFFFFF
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Enumerated boolean type
|
||||
*
|
||||
* Values other than zero should be considered to be true. Therefore
|
||||
* comparisons should not be made against KHRONOS_TRUE.
|
||||
*/
|
||||
typedef enum {
|
||||
KHRONOS_FALSE = 0,
|
||||
KHRONOS_TRUE = 1,
|
||||
KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
|
||||
} khronos_boolean_enum_t;
|
||||
|
||||
#endif /* __khrplatform_h_ */
|
||||
47
include/gl_utils.h
Normal file
47
include/gl_utils.h
Normal file
@@ -0,0 +1,47 @@
|
||||
/******************************************************************************\
|
||||
| OpenGL 4 Example Code. |
|
||||
| Accompanies written series "Anton's OpenGL 4 Tutorials" |
|
||||
| Email: anton at antongerdelan dot net |
|
||||
| First version 27 Jan 2014 |
|
||||
| Dr Anton Gerdelan, Trinity College Dublin, Ireland. |
|
||||
| See individual libraries for separate legal notices |
|
||||
\******************************************************************************/
|
||||
#ifndef _GL_UTILS_H_
|
||||
#define _GL_UTILS_H_
|
||||
|
||||
#include "glad/glad.h" // include GLEW and new version of GL on Windows
|
||||
#include <GLFW/glfw3.h> // GLFW helper library
|
||||
#include <stdarg.h>
|
||||
|
||||
#define GL_LOG_FILE "gl.log"
|
||||
|
||||
extern GLFWwindow* g_window;
|
||||
|
||||
bool restart_gl_log();
|
||||
|
||||
bool gl_log( const char* message, ... );
|
||||
|
||||
/* same as gl_log except also prints to stderr */
|
||||
bool gl_log_err( const char* message, ... );
|
||||
|
||||
void glfw_error_callback( int error, const char* description );
|
||||
|
||||
void log_gl_params();
|
||||
|
||||
void _update_fps_counter( GLFWwindow* window );
|
||||
|
||||
const char* GL_type_to_string( unsigned int type );
|
||||
|
||||
void print_shader_info_log( GLuint shader_index );
|
||||
|
||||
void print_programme_info_log( GLuint sp );
|
||||
|
||||
void print_all( GLuint sp );
|
||||
|
||||
bool is_valid( GLuint sp );
|
||||
|
||||
bool parse_file_into_str( const char* file_name, char* shader_str, int max_len );
|
||||
|
||||
GLuint create_programme_from_files( const char* vert_file_name, const char* frag_file_name );
|
||||
|
||||
#endif
|
||||
7688
include/glad/glad.h
Normal file
7688
include/glad/glad.h
Normal file
File diff suppressed because it is too large
Load Diff
91
pog.cpp
91
pog.cpp
@@ -1,12 +1,12 @@
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <EGL/egl.h>
|
||||
// #include <GL/glew.h>
|
||||
#include "include/gl_utils.h"
|
||||
#include <GL/glut.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
// #include <GLES2/gl2.h>
|
||||
#include <iostream>
|
||||
#include "pog.h"
|
||||
#include <iostream>
|
||||
int main() {
|
||||
int x;
|
||||
glfwInit();
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
@@ -23,26 +23,20 @@ int main() {
|
||||
glfwMakeContextCurrent(window);
|
||||
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||
|
||||
while (!glfwWindowShouldClose(window)) {
|
||||
processInput(window);
|
||||
|
||||
glClearColor(0.2f, 0.3f, 0.6f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
// glad: load all OpenGL function pointers
|
||||
// ---------------------------------------
|
||||
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
|
||||
std::cout << "Failed to initialize GLAD" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
if (!GLAD_GL_ARB_direct_state_access) {
|
||||
/* see
|
||||
* https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_direct_state_access.txt
|
||||
* https://www.khronos.org/opengl/wiki/Direct_State_Access. This is the way.
|
||||
*/
|
||||
std::cout << "DSA not supported!" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
float vertices[] = {
|
||||
-0.5f, -0.5f, 0.0f,
|
||||
0.5f, -0.5f, 0.0f,
|
||||
0.0f, 0.5f, 0.0f
|
||||
};
|
||||
|
||||
unsigned int VBO;
|
||||
glGenBuffers(1, &VBO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||
|
||||
|
||||
// compiling the shaders
|
||||
const char *vertexShaderSource =
|
||||
@@ -94,26 +88,57 @@ int main() {
|
||||
glDeleteShader(vertexShader);
|
||||
glDeleteShader(fragmentShader);
|
||||
|
||||
// Vertex data
|
||||
float vertices[] = {-0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f};
|
||||
|
||||
unsigned int VBO, VAO;
|
||||
glGenBuffers(1, &VBO);
|
||||
// bind vertex object
|
||||
glGenVertexArrays(1, &VAO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||
|
||||
// tell OpenGL's stupid existence how to interpret data
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
|
||||
glEnableVertexAttribArray(0);
|
||||
|
||||
// 0. copy our vertices array in a buffer for OpenGL to use
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||
// 1. then set the vertex attributes pointers
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
|
||||
glEnableVertexAttribArray(0);
|
||||
// 2. use our shader program when we want to render an object
|
||||
while (!glfwWindowShouldClose(window)) {
|
||||
// input
|
||||
// -----
|
||||
processInput(window);
|
||||
|
||||
// render
|
||||
// ------
|
||||
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
// draw our first triangle
|
||||
glUseProgram(shaderProgram);
|
||||
// 3. now draw the object
|
||||
glBindVertexArray(
|
||||
VAO); // seeing as we only have a single VAO there's no need to bind it
|
||||
// every time, but we'll do so to keep things a bit more organized
|
||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||
// glBindVertexArray(0); // no need to unbind it every time
|
||||
|
||||
unsigned int VAO;
|
||||
glGenVertexArrays(1, &VAO);
|
||||
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved
|
||||
// etc.)
|
||||
// -------------------------------------------------------------------------------
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
}
|
||||
|
||||
// optional: de-allocate all resources once they've outlived their purpose:
|
||||
// ------------------------------------------------------------------------
|
||||
glDeleteVertexArrays(1, &VAO);
|
||||
glDeleteBuffers(1, &VBO);
|
||||
glDeleteProgram(shaderProgram);
|
||||
|
||||
// glfw: terminate, clearing all previously allocated GLFW resources.
|
||||
// ------------------------------------------------------------------
|
||||
glfwTerminate();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
|
||||
glViewport(0, 0, width, height);
|
||||
}
|
||||
|
||||
4
pog.h
Normal file
4
pog.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#include <GLFW/glfw3.h>
|
||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
|
||||
|
||||
void processInput(GLFWwindow *window);
|
||||
6
vertex_shader.glsl
Normal file
6
vertex_shader.glsl
Normal file
@@ -0,0 +1,6 @@
|
||||
#version 330 core
|
||||
layout (location = 0) in vec3 aPos;
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
|
||||
}
|
||||
Reference in New Issue
Block a user