void Display::loadShader( const char* vertFile, const char* fragFile, const char* geomFile, Shader & shader ) { shader.vertex = glCreateShader(GL_VERTEX_SHADER); shader.fragment = glCreateShader(GL_FRAGMENT_SHADER); if( geomFile != NULL ) shader.geometry = glCreateShader(GL_GEOMETRY_SHADER); shader.program = glCreateProgram(); //load up the source, compile and link the shader program const char* vertSource = textFileRead(vertFile); const char* fragSource = textFileRead(fragFile); const char* geomSource = NULL; if( geomFile != NULL ) geomSource = textFileRead(geomFile); glShaderSource(shader.vertex, 1, &vertSource, 0); glShaderSource(shader.fragment, 1, &fragSource, 0); if( geomFile != NULL ) glShaderSource(shader.geometry, 1, &geomSource, 0); glCompileShader(shader.vertex); glCompileShader(shader.fragment); if( geomFile != NULL ) glCompileShader(shader.geometry); //For your convenience, i decided to throw in some compiler/linker output helper functions //from CIS 565 GLint compiled; glGetShaderiv(shader.vertex, GL_COMPILE_STATUS, &compiled); if (!compiled) { printShaderInfoLog(shader.vertex); } glGetShaderiv(shader.fragment, GL_COMPILE_STATUS, &compiled); if (!compiled) { printShaderInfoLog(shader.fragment); } if( geomFile != NULL ) { glGetShaderiv(shader.geometry, GL_COMPILE_STATUS, &compiled); if (!compiled) { printShaderInfoLog(shader.geometry); } } //finish shader setup glAttachShader(shader.program, shader.vertex); glAttachShader(shader.program, shader.fragment); if( geomFile != NULL ) glAttachShader(shader.program, shader.geometry); glLinkProgram(shader.program); //check for linking success GLint linked; glGetProgramiv(shader.program,GL_LINK_STATUS, &linked); if (!linked) { printLinkInfoLog(shader.program); } }
void attachAndLinkProgram( GLuint program, shaders_t shaders) { glAttachShader(program, shaders.vertex); glAttachShader(program, shaders.fragment); glLinkProgram(program); GLint linked; glGetProgramiv(program,GL_LINK_STATUS, &linked); if (!linked) { std::cout << "Program did not link." << std::endl; } printLinkInfoLog(program); }
void initShader(const char* vert_path, const char* frag_path) { // create shaders and shader program m_vert_handle = glCreateShader(GL_VERTEX_SHADER); m_frag_handle = glCreateShader(GL_FRAGMENT_SHADER); m_shaderprog_handle = glCreateProgram(); // load shader source from file const char* vert_source = textFileRead(vert_path); const char* frag_source = textFileRead(frag_path); glShaderSource(m_vert_handle, 1, &vert_source, NULL); glShaderSource(m_frag_handle, 1, &frag_source, NULL); glCompileShader(m_vert_handle); glCompileShader(m_frag_handle); // compile shader source GLint compiled; glGetShaderiv(m_vert_handle, GL_COMPILE_STATUS, &compiled); if(!compiled) printShaderInfoLog(m_vert_handle); glGetShaderiv(m_frag_handle, GL_COMPILE_STATUS, &compiled); if(!compiled) printShaderInfoLog(m_frag_handle); // TODO: customize this part if you want to modify the glsl shader. // bind attribute locations for the shaders // 0 for position, 1 for color, 2 for normal. glBindAttribLocation(m_shaderprog_handle, 0, "v_position"); glBindAttribLocation(m_shaderprog_handle, 1, "v_color"); glBindAttribLocation(m_shaderprog_handle, 2, "v_normal"); // attach shader to the shader program glAttachShader(m_shaderprog_handle, m_vert_handle); glAttachShader(m_shaderprog_handle, m_frag_handle); glLinkProgram(m_shaderprog_handle); GLint linked; glGetProgramiv(m_shaderprog_handle, GL_LINK_STATUS, &linked); if(!linked) printLinkInfoLog(m_shaderprog_handle); // TODO: customize this part if you want to modify the glsl shader. // query uniform locations from openGL. m_uniform_location[0] = glGetUniformLocation(m_shaderprog_handle, "u_modelviewMatrix"); m_uniform_location[1] = glGetUniformLocation(m_shaderprog_handle, "u_projMatrix"); // activate the shader program. glUseProgram(m_shaderprog_handle); }
DisplayClass::DisplayClass(void) { prism = new Prism(0, 1.0f, 1.0f, 1.0f, glm::vec4(-0.5f, -0.5f, 0.5f, 1.0f)); sphere = new Sphere(); cylinder = new Cylinder(); lightPos = new glm::vec3(10.0f, 6.0f, 0.0f); lightCol = new glm::vec3(1.0f, 1.0f, 1.0f); ambientCol = new glm::vec3(1.0f, 1.0f, 1.0f); this->camera = new Camera(); rotation = 0.0f; //Call GLEW only _after_ you get the window //I had to tell the author of your textbook that ;-) -Cory glewInit(); //Create the VBOs and IBO we'll be using to render images in OpenGL glGenBuffers(1, &vbo); glGenBuffers(1, &cbo); glGenBuffers(1, &nbo); glGenBuffers(1, &ibo); // assign locations positionLocation = 0; colorLocation = 1; normalLocation = 2; //Everybody does this glClearColor(0.6, 0.6, 0.6, 1); glEnable(GL_DEPTH_TEST); glClearDepth(1.0); glDepthFunc(GL_LEQUAL); //here is stuff for setting up our shaders const char* fragFile = "diffuseFrag.frag"; const char* vertFile = "diffuseVert.vert"; vertexShader = glCreateShader(GL_VERTEX_SHADER); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); shaderProgram = glCreateProgram(); //load up the source, compile and link the shader program const char* vertSource = textFileRead(vertFile); const char* fragSource = textFileRead(fragFile); glShaderSource(vertexShader, 1, &vertSource, 0); glShaderSource(fragmentShader, 1, &fragSource, 0); glCompileShader(vertexShader); glCompileShader(fragmentShader); //For your convenience, i decided to throw in some compiler/linker output helper functions //from CIS 565 GLint compiled; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled); if (!compiled) { printShaderInfoLog(vertexShader); } glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compiled); if (!compiled) { printShaderInfoLog(fragmentShader); } //set the attribute locations for our shaders glBindAttribLocation(shaderProgram, positionLocation, "vs_position"); glBindAttribLocation(shaderProgram, normalLocation, "vs_normal"); glBindAttribLocation(shaderProgram, colorLocation, "vs_color"); //finish shader setup glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); //check for linking success GLint linked; glGetProgramiv(shaderProgram,GL_LINK_STATUS, &linked); if (!linked) { printLinkInfoLog(shaderProgram); } //Get the uniform locations for our shaders, unfortunately they can not be set by us, we have //to ask OpenGL for them u_modelMatrixLocation = glGetUniformLocation(shaderProgram, "u_modelMatrix"); u_projMatrixLocation = glGetUniformLocation(shaderProgram, "u_projMatrix"); u_lightPosLocation = glGetUniformLocation(shaderProgram, "u_lightPos"); u_lightColLocation = glGetUniformLocation(shaderProgram, "u_lightCol"); u_cameraPosLocation = glGetUniformLocation(shaderProgram, "u_cameraPos"); u_ambientColLocation = glGetUniformLocation(shaderProgram, "u_ambientCol"); //Always remember that it doesn't do much good if you don't have OpenGL actually use the shaders glUseProgram(shaderProgram); camera->resizeWindow(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
Renderer::Renderer () { //Everybody does this glClearColor(0, 0, 0, 1); glEnable(GL_DEPTH_TEST); glClearDepth(1.0); glDepthFunc(GL_LEQUAL); //here is stuff for setting up our shaders const char* fragFile = "diffuseFrag.frag"; const char* vertFile = "diffuseVert.vert"; vertexShader = glCreateShader(GL_VERTEX_SHADER); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); shaderProgram = glCreateProgram(); //load up the source, compile and link the shader program const char* vertSource = textFileRead(vertFile); const char* fragSource = textFileRead(fragFile); glShaderSource(vertexShader, 1, &vertSource, 0); glShaderSource(fragmentShader, 1, &fragSource, 0); glCompileShader(vertexShader); glCompileShader(fragmentShader); //For your convenience, i decided to throw in some compiler/linker output helper functions //from CIS 565 GLint compiled; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled); if (!compiled) { printShaderInfoLog(vertexShader); } glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compiled); if (!compiled) { printShaderInfoLog(fragmentShader); } //set the attribute locations for our shaders glBindAttribLocation(shaderProgram, positionLocation, "vs_position"); glBindAttribLocation(shaderProgram, normalLocation, "vs_normal"); glBindAttribLocation(shaderProgram, colorLocation, "vs_color"); //finish shader setup glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); //check for linking success GLint linked; glGetProgramiv(shaderProgram,GL_LINK_STATUS, &linked); if (!linked) { printLinkInfoLog(shaderProgram); } //Get the uniform locations for our shaders, unfortunately they can not be set by us, we have //to ask OpenGL for them u_modelMatrixLocation = glGetUniformLocation(shaderProgram, "u_modelMatrix"); u_projMatrixLocation = glGetUniformLocation(shaderProgram, "u_projMatrix"); //Always remember that it doesn't do much good if you don't have OpenGL actually use the shaders glUseProgram(shaderProgram); }