2018-05-09 05:09:57 +02:00
|
|
|
#include <windows.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "opengl.h"
|
|
|
|
|
|
|
|
|
|
|
|
// Program
|
|
|
|
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
|
|
|
|
PFNGLDELETEPROGRAMPROC glDeleteProgram = NULL;
|
|
|
|
PFNGLUSEPROGRAMPROC glUseProgram = NULL;
|
|
|
|
PFNGLATTACHSHADERPROC glAttachShader = NULL;
|
|
|
|
PFNGLDETACHSHADERPROC glDetachShader = NULL;
|
|
|
|
PFNGLLINKPROGRAMPROC glLinkProgram = NULL;
|
|
|
|
PFNGLGETPROGRAMIVPROC glGetProgramiv = NULL;
|
|
|
|
PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = NULL;
|
|
|
|
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL;
|
|
|
|
PFNGLUNIFORM1IPROC glUniform1i = NULL;
|
|
|
|
PFNGLUNIFORM1IVPROC glUniform1iv = NULL;
|
|
|
|
PFNGLUNIFORM2IVPROC glUniform2iv = NULL;
|
|
|
|
PFNGLUNIFORM3IVPROC glUniform3iv = NULL;
|
|
|
|
PFNGLUNIFORM4IVPROC glUniform4iv = NULL;
|
|
|
|
PFNGLUNIFORM1FPROC glUniform1f = NULL;
|
|
|
|
PFNGLUNIFORM1FVPROC glUniform1fv = NULL;
|
|
|
|
PFNGLUNIFORM2FVPROC glUniform2fv = NULL;
|
|
|
|
PFNGLUNIFORM3FVPROC glUniform3fv = NULL;
|
|
|
|
PFNGLUNIFORM4FVPROC glUniform4fv = NULL;
|
2018-05-12 12:28:07 +02:00
|
|
|
PFNGLUNIFORM4FPROC glUniform4f = NULL;
|
2018-05-09 05:09:57 +02:00
|
|
|
PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = NULL;
|
|
|
|
PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation = NULL;
|
|
|
|
PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f = NULL;
|
|
|
|
PFNGLVERTEXATTRIB1FVPROC glVertexAttrib1fv = NULL;
|
|
|
|
PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv = NULL;
|
|
|
|
PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv = NULL;
|
|
|
|
PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv = NULL;
|
|
|
|
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = NULL;
|
|
|
|
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = NULL;
|
|
|
|
PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation = NULL;
|
|
|
|
PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform = NULL;
|
|
|
|
|
|
|
|
// Shader
|
|
|
|
PFNGLCREATESHADERPROC glCreateShader = NULL;
|
|
|
|
PFNGLDELETESHADERPROC glDeleteShader = NULL;
|
|
|
|
PFNGLSHADERSOURCEPROC glShaderSource = NULL;
|
|
|
|
PFNGLCOMPILESHADERPROC glCompileShader = NULL;
|
|
|
|
PFNGLGETSHADERIVPROC glGetShaderiv = NULL;
|
|
|
|
|
|
|
|
// VBO
|
|
|
|
PFNGLGENBUFFERSPROC glGenBuffers = NULL;
|
|
|
|
PFNGLBINDBUFFERPROC glBindBuffer = NULL;
|
|
|
|
PFNGLBUFFERDATAPROC glBufferData = NULL;
|
|
|
|
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL;
|
2018-05-12 12:28:07 +02:00
|
|
|
PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL;
|
2018-05-09 05:09:57 +02:00
|
|
|
|
|
|
|
PFNGLGENBUFFERSARBPROC glGenBuffersARB = NULL;
|
|
|
|
PFNGLBINDBUFFERARBPROC glBindBufferARB = NULL;
|
|
|
|
PFNGLBUFFERDATAARBPROC glBufferDataARB = NULL;
|
|
|
|
PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = NULL;
|
|
|
|
PFNGLMAPBUFFERARBPROC glMapBufferARB = NULL;
|
|
|
|
PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = NULL;
|
|
|
|
|
|
|
|
PFNGLACTIVETEXTUREARBPROC glActiveTexture = NULL;
|
|
|
|
PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture = NULL;
|
|
|
|
PFNGLMULTITEXCOORD2FPROC glMultiTexCoord2f = NULL;
|
|
|
|
|
2018-05-12 12:28:07 +02:00
|
|
|
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL;
|
|
|
|
PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL;
|
|
|
|
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL;
|
|
|
|
PFNGLDRAWBUFFERSPROC glDrawBuffers = NULL;
|
|
|
|
PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL;
|
|
|
|
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL;
|
|
|
|
|
2018-05-09 05:09:57 +02:00
|
|
|
void OpenGL_Init()
|
|
|
|
{
|
|
|
|
// Program
|
|
|
|
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
|
|
|
|
glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
|
|
|
|
glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
|
|
|
|
glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
|
|
|
|
glDetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader");
|
|
|
|
glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
|
|
|
|
glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");
|
|
|
|
glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");
|
|
|
|
glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation");
|
|
|
|
glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i");
|
|
|
|
glUniform1iv = (PFNGLUNIFORM1IVPROC)wglGetProcAddress("glUniform1iv");
|
|
|
|
glUniform2iv = (PFNGLUNIFORM2IVPROC)wglGetProcAddress("glUniform2iv");
|
|
|
|
glUniform3iv = (PFNGLUNIFORM3IVPROC)wglGetProcAddress("glUniform3iv");
|
|
|
|
glUniform4iv = (PFNGLUNIFORM4IVPROC)wglGetProcAddress("glUniform4iv");
|
|
|
|
glUniform1f = (PFNGLUNIFORM1FPROC)wglGetProcAddress("glUniform1f");
|
|
|
|
glUniform1fv = (PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv");
|
|
|
|
glUniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress("glUniform2fv");
|
|
|
|
glUniform3fv = (PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv");
|
|
|
|
glUniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv");
|
2018-05-12 12:28:07 +02:00
|
|
|
glUniform4f = (PFNGLUNIFORM4FPROC)wglGetProcAddress("glUniform4f");
|
2018-05-09 05:09:57 +02:00
|
|
|
glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv");
|
|
|
|
glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)wglGetProcAddress("glGetAttribLocation");
|
|
|
|
glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)wglGetProcAddress("glVertexAttrib1f");
|
|
|
|
glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)wglGetProcAddress("glVertexAttrib1fv");
|
|
|
|
glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)wglGetProcAddress("glVertexAttrib2fv");
|
|
|
|
glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)wglGetProcAddress("glVertexAttrib3fv");
|
|
|
|
glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib4fv");
|
|
|
|
glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
|
|
|
|
glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)wglGetProcAddress("glBindAttribLocation");
|
|
|
|
|
|
|
|
// Shader
|
|
|
|
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
|
|
|
|
glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
|
|
|
|
glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
|
|
|
|
glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
|
|
|
|
glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
|
|
|
|
|
|
|
|
// VBO
|
|
|
|
glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
|
|
|
|
glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
|
|
|
|
glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
|
|
|
|
glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");
|
2018-05-12 12:28:07 +02:00
|
|
|
glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers");
|
2018-05-09 05:09:57 +02:00
|
|
|
|
|
|
|
glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB");
|
|
|
|
glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");
|
|
|
|
glBufferDataARB = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress("glBufferDataARB");
|
|
|
|
glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)wglGetProcAddress("glDeleteBuffersARB");
|
|
|
|
glMapBufferARB = (PFNGLMAPBUFFERARBPROC)wglGetProcAddress("glMapBufferARB");
|
|
|
|
glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)wglGetProcAddress("glUnmapBufferARB");
|
|
|
|
|
|
|
|
glActiveTexture = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTexture");
|
|
|
|
glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)wglGetProcAddress("glClientActiveTexture");
|
|
|
|
glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)wglGetProcAddress("glMultiTexCoord2f");
|
2018-05-12 12:28:07 +02:00
|
|
|
|
|
|
|
glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress("glGenFramebuffers");
|
|
|
|
glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress("glBindFramebuffer");
|
|
|
|
glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress("glFramebufferTexture2D");
|
|
|
|
glDrawBuffers = (PFNGLDRAWBUFFERSPROC)wglGetProcAddress("glDrawBuffers");
|
|
|
|
glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)wglGetProcAddress("glCheckFramebufferStatus");
|
|
|
|
glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers");
|
2018-05-09 05:09:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL OpenGL_ExtExists(char *ext)
|
|
|
|
{
|
|
|
|
char *glext = (char *)glGetString(GL_EXTENSIONS);
|
|
|
|
if (glext)
|
|
|
|
{
|
|
|
|
if (strstr(glext, ext))
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2018-05-12 12:28:07 +02:00
|
|
|
GLuint OpenGL_BuildProgram(const GLchar *vertSource, const GLchar *fragSource)
|
2018-05-09 05:09:57 +02:00
|
|
|
{
|
|
|
|
if (!glCreateShader || !glShaderSource || !glCompileShader || !glCreateProgram ||
|
2018-05-09 05:41:58 +02:00
|
|
|
!glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader)
|
2018-05-09 05:09:57 +02:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
|
|
|
|
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
|
|
|
|
|
|
if (!vertShader || !fragShader)
|
|
|
|
return 0;
|
|
|
|
|
2018-05-12 12:28:07 +02:00
|
|
|
const GLchar *vertSrc[2] = { "#define VERTEX\n", vertSource };
|
|
|
|
const GLchar *fragSrc[2] = { "#define FRAGMENT\n", fragSource };
|
|
|
|
|
|
|
|
glShaderSource(vertShader, 2, vertSrc, NULL);
|
|
|
|
glShaderSource(fragShader, 2, fragSrc, NULL);
|
2018-05-09 05:09:57 +02:00
|
|
|
|
|
|
|
GLint isCompiled = 0;
|
|
|
|
|
|
|
|
glCompileShader(vertShader);
|
|
|
|
if (glGetShaderiv)
|
|
|
|
{
|
|
|
|
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &isCompiled);
|
|
|
|
if (isCompiled == GL_FALSE)
|
|
|
|
{
|
|
|
|
if (glDeleteShader)
|
|
|
|
glDeleteShader(vertShader);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
glCompileShader(fragShader);
|
|
|
|
if (glGetShaderiv)
|
|
|
|
{
|
|
|
|
glGetShaderiv(fragShader, GL_COMPILE_STATUS, &isCompiled);
|
|
|
|
if (isCompiled == GL_FALSE)
|
|
|
|
{
|
|
|
|
if (glDeleteShader)
|
|
|
|
glDeleteShader(fragShader);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
GLuint program = glCreateProgram();
|
|
|
|
if (program)
|
|
|
|
{
|
|
|
|
glAttachShader(program, vertShader);
|
|
|
|
glAttachShader(program, fragShader);
|
|
|
|
|
|
|
|
glLinkProgram(program);
|
|
|
|
|
2018-05-09 05:41:58 +02:00
|
|
|
glDetachShader(program, vertShader);
|
|
|
|
glDetachShader(program, fragShader);
|
|
|
|
glDeleteShader(vertShader);
|
|
|
|
glDeleteShader(fragShader);
|
|
|
|
|
2018-05-09 05:09:57 +02:00
|
|
|
if (glGetProgramiv)
|
|
|
|
{
|
|
|
|
GLint isLinked = 0;
|
|
|
|
glGetProgramiv(program, GL_LINK_STATUS, &isLinked);
|
|
|
|
if (isLinked == GL_FALSE)
|
|
|
|
{
|
|
|
|
if (glDeleteProgram)
|
|
|
|
glDeleteProgram(program);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return program;
|
|
|
|
}
|
2018-05-12 12:28:07 +02:00
|
|
|
|
|
|
|
GLuint OpenGL_BuildProgramFromFile(const char *filePath)
|
|
|
|
{
|
|
|
|
GLuint program = 0;
|
|
|
|
|
|
|
|
FILE *file = fopen(filePath, "rb");
|
|
|
|
if (file)
|
|
|
|
{
|
|
|
|
fseek(file, 0, SEEK_END);
|
|
|
|
long fileSize = ftell(file);
|
|
|
|
fseek(file, 0, SEEK_SET);
|
|
|
|
|
|
|
|
char *source = malloc(fileSize + 1);
|
|
|
|
if (source)
|
|
|
|
{
|
|
|
|
fread(source, fileSize, 1, file);
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
source[fileSize] = 0;
|
|
|
|
|
|
|
|
program = OpenGL_BuildProgram(source, source);
|
|
|
|
free(source);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return program;
|
|
|
|
}
|