Created
July 30, 2012 18:44
-
-
Save voxels/3209084 to your computer and use it in GitHub Desktop.
GLSDK Template using GLFW
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1) VS2010 Empty Project | |
2) Add glsdk_template.cpp file to the Source Files folder | |
3) Project > Properties > C/C++ > Additional Include Directories: | |
a) xxx..\glutil\include\ | |
b) xxx..\glload\include\ | |
c) xxx..\glimg\include\ | |
d) xxx..\glm\ | |
e) xxx..\glfw\include\ | |
f) xxx..\freeglut\include\ | |
4) Project > Properties > Linker > General > Additional Library Directories | |
a) xxx..\glutil\lib\ | |
b) xxx..\glimg\lib\ | |
c) xxx..\glload\lib\ | |
d) xxx..\glfw\library\ (((NOTE THIS IS \library and NOT \lib ))) | |
e) xxx..\freeglut\lib | |
5) Project > Properties > Linker > Input > Additional Dependencies | |
a) glloadD.lib | |
b) glimgD.lib | |
c) glutilD.lib | |
d) glfwD.lib | |
e) glu32.lib | |
f) opengl32.lib | |
g) gdi32.lib | |
h) winmm.lib | |
i) user32.lib | |
j) freeglutD.lib | |
6) Add template code: | |
#include <string> | |
#include <exception> | |
#include <stdexcept> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <glload/gl_3_3.h> | |
#include <glload/gll.hpp> | |
#include <GL/glfw.h> | |
GLuint positionBufferObject; | |
GLuint program; | |
GLuint vao; | |
GLuint BuildShader(GLenum eShaderType, const std::string &shaderText) | |
{ | |
GLuint shader = glCreateShader(eShaderType); | |
const char *strFileData = shaderText.c_str(); | |
glShaderSource(shader, 1, &strFileData, NULL); | |
glCompileShader(shader); | |
GLint status; | |
glGetShaderiv(shader, GL_COMPILE_STATUS, &status); | |
if (status == GL_FALSE) | |
{ | |
//With ARB_debug_output, we already get the info log on compile failure. | |
if(!glext_ARB_debug_output) | |
{ | |
GLint infoLogLength; | |
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); | |
GLchar *strInfoLog = new GLchar[infoLogLength + 1]; | |
glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog); | |
const char *strShaderType = NULL; | |
switch(eShaderType) | |
{ | |
case GL_VERTEX_SHADER: strShaderType = "vertex"; break; | |
case GL_GEOMETRY_SHADER: strShaderType = "geometry"; break; | |
case GL_FRAGMENT_SHADER: strShaderType = "fragment"; break; | |
} | |
fprintf(stderr, "Compile failure in %s shader:\n%s\n", strShaderType, strInfoLog); | |
delete[] strInfoLog; | |
} | |
throw std::runtime_error("Compile failure in shader."); | |
} | |
return shader; | |
} | |
void init() | |
{ | |
glGenVertexArrays(1, &vao); | |
glBindVertexArray(vao); | |
const float vertexPositions[] = { | |
0.75f, 0.75f, 0.0f, 1.0f, | |
0.75f, -0.75f, 0.0f, 1.0f, | |
-0.75f, -0.75f, 0.0f, 1.0f, | |
}; | |
glGenBuffers(1, &positionBufferObject); | |
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW); | |
glBindBuffer(GL_ARRAY_BUFFER, 0); | |
const std::string vertexShader( | |
"#version 330\n" | |
"layout(location = 0) in vec4 position;\n" | |
"void main()\n" | |
"{\n" | |
" gl_Position = position;\n" | |
"}\n" | |
); | |
const std::string fragmentShader( | |
"#version 330\n" | |
"out vec4 outputColor;\n" | |
"void main()\n" | |
"{\n" | |
" outputColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n" | |
"}\n" | |
); | |
GLuint vertShader = BuildShader(GL_VERTEX_SHADER, vertexShader); | |
GLuint fragShader = BuildShader(GL_FRAGMENT_SHADER, fragmentShader); | |
program = glCreateProgram(); | |
glAttachShader(program, vertShader); | |
glAttachShader(program, fragShader); | |
glLinkProgram(program); | |
GLint status; | |
glGetProgramiv (program, GL_LINK_STATUS, &status); | |
if (status == GL_FALSE) | |
{ | |
if(!glext_ARB_debug_output) | |
{ | |
GLint infoLogLength; | |
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength); | |
GLchar *strInfoLog = new GLchar[infoLogLength + 1]; | |
glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog); | |
fprintf(stderr, "Linker failure: %s\n", strInfoLog); | |
delete[] strInfoLog; | |
} | |
throw std::runtime_error("Shader could not be linked."); | |
} | |
} | |
//Called to update the display. | |
//You should call glutSwapBuffers after all of your rendering to display what you rendered. | |
//If you need continuous updates of the screen, call glutPostRedisplay() at the end of the function. | |
void display() | |
{ | |
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); | |
glClear(GL_COLOR_BUFFER_BIT); | |
glUseProgram(program); | |
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); | |
glEnableVertexAttribArray(0); | |
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
glDisableVertexAttribArray(0); | |
glUseProgram(0); | |
glfwSwapBuffers(); | |
} | |
//Called whenever the window is resized. The new window size is given, in pixels. | |
//This is an opportunity to call glViewport or glScissor to keep up with the change in size. | |
void reshape (int w, int h) | |
{ | |
glViewport(0, 0, (GLsizei) w, (GLsizei) h); | |
} | |
void APIENTRY DebugFunc(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, | |
const GLchar* message, GLvoid* userParam) | |
{ | |
std::string srcName; | |
switch(source) | |
{ | |
case GL_DEBUG_SOURCE_API_ARB: srcName = "API"; break; | |
case GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB: srcName = "Window System"; break; | |
case GL_DEBUG_SOURCE_SHADER_COMPILER_ARB: srcName = "Shader Compiler"; break; | |
case GL_DEBUG_SOURCE_THIRD_PARTY_ARB: srcName = "Third Party"; break; | |
case GL_DEBUG_SOURCE_APPLICATION_ARB: srcName = "Application"; break; | |
case GL_DEBUG_SOURCE_OTHER_ARB: srcName = "Other"; break; | |
} | |
std::string errorType; | |
switch(type) | |
{ | |
case GL_DEBUG_TYPE_ERROR_ARB: errorType = "Error"; break; | |
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB: errorType = "Deprecated Functionality"; break; | |
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB: errorType = "Undefined Behavior"; break; | |
case GL_DEBUG_TYPE_PORTABILITY_ARB: errorType = "Portability"; break; | |
case GL_DEBUG_TYPE_PERFORMANCE_ARB: errorType = "Performance"; break; | |
case GL_DEBUG_TYPE_OTHER_ARB: errorType = "Other"; break; | |
} | |
std::string typeSeverity; | |
switch(severity) | |
{ | |
case GL_DEBUG_SEVERITY_HIGH_ARB: typeSeverity = "High"; break; | |
case GL_DEBUG_SEVERITY_MEDIUM_ARB: typeSeverity = "Medium"; break; | |
case GL_DEBUG_SEVERITY_LOW_ARB: typeSeverity = "Low"; break; | |
} | |
printf("%s from %s,\t%s priority\nMessage: %s\n", | |
errorType.c_str(), srcName.c_str(), typeSeverity.c_str(), message); | |
} | |
int main(int argc, char** argv) | |
{ | |
if(!glfwInit()) | |
return -1; | |
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); | |
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3); | |
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | |
#ifdef DEBUG | |
glfwOpenWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); | |
#endif | |
if(!glfwOpenWindow(500, 500, 8, 8, 8, 8, 24, 8, GLFW_WINDOW)) | |
{ | |
glfwTerminate(); | |
return -1; | |
} | |
if(glload::LoadFunctions() == glload::LS_LOAD_FAILED) | |
{ | |
glfwTerminate(); | |
return -1; | |
} | |
glfwSetWindowTitle("GLFW Demo"); | |
if(glext_ARB_debug_output) | |
{ | |
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); | |
glDebugMessageCallbackARB(DebugFunc, (void*)15); | |
} | |
init(); | |
glfwSetWindowSizeCallback(reshape); | |
//Main loop | |
while(true) | |
{ | |
display(); | |
if(glfwGetKey(GLFW_KEY_ESC) || !glfwGetWindowParam(GLFW_OPENED)) | |
break; | |
} | |
glfwTerminate(); | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment