Added GLEW support and shader are functional now
All fragments will be painted red
This commit is contained in:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user