Added GLEW support and shader are functional now

All fragments will be painted red
This commit is contained in:
Caesar2011
2016-09-04 19:42:05 +02:00
parent 2f6088096b
commit 95c58c1abb
36 changed files with 25801 additions and 65 deletions

View File

@@ -1,16 +1,15 @@
// http://stackoverflow.com/questions/6005076/building-glew-on-windows-with-mingw
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <stdio.h>
#include <iostream>
GLuint loadBMP_custom(const char * imagepath);
void EnableTransparency()
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
#include <fstream>
#include <vector>
#include <stdexcept>
GLuint LoadTexture(char *filename,int *textw,int *texth) {
SDL_Surface *surface;
@@ -71,19 +70,120 @@ void DrawTexture(int x, int y, GLuint textureid,int textw,int texth) {
glDisable(GL_TEXTURE_2D );
}
GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path){
// Create the shaders
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
// Read the Vertex Shader code from the file
std::string VertexShaderCode;
std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
if(VertexShaderStream.is_open()){
std::string Line = "";
while(getline(VertexShaderStream, Line))
VertexShaderCode += "\n" + Line;
VertexShaderStream.close();
}else{
printf("Impossible to open %s. Are you in the right directory ? Don't forget to read the FAQ !\n", vertex_file_path);
getchar();
return 0;
}
// Read the Fragment Shader code from the file
std::string FragmentShaderCode;
std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
if(FragmentShaderStream.is_open()){
std::string Line = "";
while(getline(FragmentShaderStream, Line))
FragmentShaderCode += "\n" + Line;
FragmentShaderStream.close();
}
GLint Result = GL_FALSE;
int InfoLogLength;
// Compile Vertex Shader
printf("Compiling shader : %s\n", vertex_file_path);
char const * VertexSourcePointer = VertexShaderCode.c_str();
glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
glCompileShader(VertexShaderID);
// Check Vertex Shader
glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> VertexShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
printf("%s\n", &VertexShaderErrorMessage[0]);
}
// Compile Fragment Shader
printf("Compiling shader : %s\n", fragment_file_path);
char const * FragmentSourcePointer = FragmentShaderCode.c_str();
glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
glCompileShader(FragmentShaderID);
// Check Fragment Shader
glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
printf("%s\n", &FragmentShaderErrorMessage[0]);
}
// Link the program
printf("Linking program\n");
GLuint ProgramID = glCreateProgram();
glAttachShader(ProgramID, VertexShaderID);
glAttachShader(ProgramID, FragmentShaderID);
glLinkProgram(ProgramID);
// Check the program
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> ProgramErrorMessage(InfoLogLength+1);
glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
printf("%s\n", &ProgramErrorMessage[0]);
}
glDetachShader(ProgramID, VertexShaderID);
glDetachShader(ProgramID, FragmentShaderID);
glDeleteShader(VertexShaderID);
glDeleteShader(FragmentShaderID);
return ProgramID;
}
int main(int argc, char* args[]) {
GLFWwindow* window;
GLuint myglu;
GLuint tex_jpe;
GLuint tex_jpg;
GLuint tex_gif;
GLuint tex_png;
GLuint tex_bmp;
int textw, texth;
int timer = 0;
/* Initialize the library */
/* GLFW */
if (!glfwInit())
return -1;
/* SDL */
if (SDL_Init(SDL_INIT_VIDEO) < 0)
printf("SDL Error");
if (!glfwInit()) {
printf("GLFW Error");
return 1;
}
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window) {
@@ -92,18 +192,54 @@ int main(int argc, char* args[]) {
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* GLEW */
glewExperimental = GL_FALSE;
GLenum error = glGetError();
if (error != GL_NO_ERROR)
{
std::cout << "OpenGL Error: " << error << std::endl;
}
GLenum glewinit = glewInit();
if (glewinit != GLEW_OK) {
std::cout << "Glew not okay! " << glewinit;
return 1;
}
/* SDL */
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("SDL Error");
return 1;
}
// INIT
myglu=LoadTexture("../img/tests/stones.bmp",&textw,&texth);
tex_jpe=LoadTexture("../img/tests/test.jpeg",&textw,&texth);
tex_jpg=LoadTexture("../img/tests/test.jpg",&textw,&texth);
tex_png=LoadTexture("../img/tests/test.png",&textw,&texth);
tex_bmp=LoadTexture("../img/tests/test.bmp",&textw,&texth);
GLuint programID = LoadShaders("trimap.vertexshader", "trimap.fragmentshader");
printf("%d", programID);
// INIT END
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window)) {
timer += 1;
if (timer==800)
timer = 0;
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
// RENDER
DrawTexture(50,50,myglu,textw,texth);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programID);
// RENDER
if (timer<200)
DrawTexture(50,50,tex_jpe,textw,texth);
else if (timer<400)
DrawTexture(50,50,tex_jpg,textw,texth);
else if (timer<600)
DrawTexture(50,50,tex_png,textw,texth);
else
DrawTexture(50,50,tex_bmp,textw,texth);
// RENDER END
/* Swap front and back buffers */