PDA

View Full Version : Problem with glShaderSource crashing



DaBOSS54320
09-06-2014, 05:57 AM
Hello, I'm new to the forums and am also fairly new to using OpenGL and appreciate in advance any help I get.

I am using SDL to create my OpenGL context and window and glew to load the extensions, and using the MinGW GCC compiler on windows 7.
My code below crashes at the first glShaderSource called (I know from commenting out) and am not sure why. Below is my C source code and GLSL shader source code.
My goal at the moment is to simply draw a triangle in a window.


#include<stdio.h>
#include<GL/glew.h>
#include<SDL/SDL.h>

unsigned int getFileLength(FILE* file);
int readFile(FILE* file,char* output);
void writeFile(FILE* file,char* input);

int main(int argc,char* argv[]){
//Init SDL
if(SDL_Init(SDL_INIT_VIDEO))
fprintf(stderr,"Error: SDL failed to initialize: %s",SDL_GetError());

//OpenGL 3.3
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3 );
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3 );

//Create a window and OpenGL context
SDL_Window* window = SDL_CreateWindow("The Window",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,640 ,480,SDL_WINDOW_OPENGL);
SDL_GLContext context = SDL_GL_CreateContext(window);

//Init GLEW
GLenum err = glewInit();
if(err != GLEW_OK)
fprintf(stderr,"Error: GLEW failed to initialize: %s",glewGetErrorString(err));

//Create a triangle (This will be drawn on screen later)
float triangle[] = {
0.0f,0.5f,
0.5f,-0.5f,
-0.5f,-0.5f
};

//Upload triangle data
GLuint buffer;
glGenBuffers(1,&buffer);
glBindBuffer(GL_ARRAY_BUFFER,buffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(triangle),&triangle,GL_STATIC_DRAW);

//Create, load and compile shaders
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
FILE* vertexShaderFile = fopen("shaders/vertex.shader","r");
FILE* fragmentShaderFile = fopen("shaders/fragment.shader","r");
if(vertexShaderFile == NULL || fragmentShaderFile == NULL)
fprintf(stderr,"Error: Shader sources could not be found");
GLchar vertexShaderSource[getFileLength(vertexShaderFile) + 1],fragmentShaderSource[getFileLength(fragmentShaderFile) + 1];
readFile(vertexShaderFile,vertexShaderSource);
readFile(fragmentShaderFile,fragmentShaderSource);
glShaderSource(vertexShader,1,(const GLchar**) &vertexShaderSource,NULL);
glShaderSource(fragmentShader,1,(const GLchar**) &fragmentShaderSource,NULL);
glCompileShader(vertexShader);
glCompileShader(fragmentShader);
GLchar vertexShaderLog[1000],fragmentShaderLog[1000];
glGetShaderInfoLog(vertexShader,sizeof(vertexShade rLog),NULL,vertexShaderLog);
glGetShaderInfoLog(fragmentShader,sizeof(fragmentS haderLog),NULL,fragmentShaderLog);
FILE* vertexShaderLogFile = fopen("shaders/vertexShader.log","w");
FILE* fragmentShaderLogFile = fopen("shaders/fragmentShader.log","w");
writeFile(vertexShaderLogFile,vertexShaderLog);
writeFile(fragmentShaderLogFile,fragmentShaderLog) ;

SDL_Quit();
return 0;
}


//Shader loading functions
unsigned int getFileLength(FILE* file){
rewind(file);
int c,count = 0;
while((c = fgetc(file)) != EOF)
count++;
return count;
}

int readFile(FILE* file,char* output){
rewind(file);
int c,i;
for(i = 0;(c = fgetc(file)) != EOF;i++)
output[i] = c;
output[i] = '\0';
return i;
}

void writeFile(FILE* file,char* input){
int i;
for(i = 0;i < sizeof(input);i++)
fputc(input[i],file);
}


and the shaders... (I copied these from an example on some tutorial site)

Vertex Shader:

void main(){
vec4 a = gl_Vertex;
a.x = a.x * 0.5;
a.y = a.y * 0.5;

gl_Position = gl_ModelViewProjectionMatrix * a;
}


Fragment Shader:

void main(){
gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

sueyllam
09-06-2014, 11:47 PM
I believe you need to specify a version for the shaders, may be this is it...

DaBOSS54320
09-07-2014, 03:44 AM
Thanks for the tip, and I actually did try to add the version shortly after posting this topic but sadly it did not work. I'll google search an example and compare it with mine to see... probably should of done that before making this topic... ha.