Browse Source

model loading (ch4)

master
alistair 3 years ago
parent
commit
f27b1bbcbc
  1. 133
      src/main.cpp
  2. 254
      src/main1.bak
  3. 267
      src/main2.bak
  4. 10
      src/mesh.cpp
  5. 1
      src/mesh.h
  6. 63
      src/shaders.cpp
  7. 14
      src/shaders.h
  8. 8
      src/shaders/test.frag
  9. 6
      src/shaders/test.vert

133
src/main.cpp

@ -56,7 +56,6 @@ void printProgramLog( GLuint program ) @@ -56,7 +56,6 @@ void printProgramLog( GLuint program )
class SDLGLGLWindow {
GLuint gProgramID = 0;
/* array buffers */
GLuint gVBO = 0;
GLuint gIBO = 0;
@ -83,8 +82,7 @@ class SDLGLGLWindow { @@ -83,8 +82,7 @@ class SDLGLGLWindow {
glm::mat4 model = glm::mat3(1.0f);
glm::mat4 view = glm::mat4(1.0f);
private:
Shader *vertex;
Shader *fragment;
Shader *shader;
Model *bp_model;
public:
@ -179,29 +177,21 @@ class SDLGLGLWindow { @@ -179,29 +177,21 @@ class SDLGLGLWindow {
//Success flag
bool success = true;
//Generate program
gProgramID = glCreateProgram();
vertex = new Shader(GL_VERTEX_SHADER, gProgramID, "src/shaders/test.vert");
fragment = new Shader(GL_FRAGMENT_SHADER, gProgramID, "src/shaders/test.frag");
shader = new Shader("src/shaders/test.vert", "src/shaders/test.frag");
//Link program
glLinkProgram( gProgramID );
stbi_set_flip_vertically_on_load(true);
bp_model = new Model("src/assets/objects/backpack/backpack.obj");
//Check for errors
GLint programSuccess = GL_TRUE;
glGetProgramiv( gProgramID, GL_LINK_STATUS, &programSuccess );
if( programSuccess != GL_TRUE )
{
printf( "Error linking program %d!\n", gProgramID );
printProgramLog(gProgramID);
return false;
}
model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));
// model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f);
glEnable(GL_DEPTH_TEST);
return true;
/* textures */
@ -246,13 +236,13 @@ class SDLGLGLWindow { @@ -246,13 +236,13 @@ class SDLGLGLWindow {
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture[1]);
vertex->use();
fragment->setInt("material.diffusemap", 0);
shader->use();
shader->setInt("material.diffusemap", 0);
fragment->setInt("material.specularmap", 1);
shader->setInt("material.specularmap", 1);
fragment->setBool("lighting_emit", false);
shader->setBool("lighting_emit", false);
float cubeVertices[] = {
// vertices normals textures
@ -331,9 +321,9 @@ class SDLGLGLWindow { @@ -331,9 +321,9 @@ class SDLGLGLWindow {
GLint gVertexPos2DLocation = -1;
GLint gtexlocation = -1;
GLint normloc = -1;
gVertexPos2DLocation = glGetAttribLocation( gProgramID, "LVertexPos2D" );
gtexlocation = glGetAttribLocation( gProgramID, "texCoord" );
normloc = glGetAttribLocation( gProgramID, "aNormal" );
gVertexPos2DLocation = shader->get_attrib("LVertexPos2D");
gtexlocation = shader->get_attrib("texCoord");
normloc = shader->get_attrib( "aNormal" );
glVertexAttribPointer( gVertexPos2DLocation, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), NULL);
glVertexAttribPointer( normloc, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void *)(3 * sizeof (float)));
@ -351,7 +341,6 @@ class SDLGLGLWindow { @@ -351,7 +341,6 @@ class SDLGLGLWindow {
glEnableVertexAttribArray(0);
glEnable(GL_DEPTH_TEST);
return success;
}
@ -367,40 +356,39 @@ class SDLGLGLWindow { @@ -367,40 +356,39 @@ class SDLGLGLWindow {
float timeVal = SDL_GetTicks() / 1000.0;
float green = (sin(timeVal) / 2.0f) + 0.5;
int vertexcol = glGetUniformLocation(gProgramID, "ourColour");
//Bind program
glUseProgram( gProgramID );
glUniform3f(glGetUniformLocation(vertex->program, "objectColour"), 1.0f, 0.5f, 0.31f);
fragment->setInt("lights[0].type", 2);
fragment->setFloat("lights[0].angle_cutoff", glm::cos(glm::radians(12.5f)));
fragment->setFloat("lights[0].outer_angle_cutoff", glm::cos(glm::radians(17.5f)));
fragment->setVec3("lights[0].direction", camera_front);
fragment->setVec3("lights[0].position", camera_pos);
fragment->setVec3("lights[0].ambient", glm::vec3(0.3));
fragment->setVec3("lights[0].diffuse", glm::vec3(0.8));
fragment->setVec3("lights[0].specular", glm::vec3(1.0));
fragment->setBool("lights[0].attenuate", true);
fragment->setVec3("lights[0].attenuation", glm::vec3(1.0, 0.09, 0.032));
fragment->setInt("num_lights", 2);
fragment->setInt("lights[1].type", 1);
fragment->setVec3("lights[1].position", lightPositions[0]);
fragment->setVec3("lights[1].ambient", glm::vec3(0.3));
fragment->setVec3("lights[1].diffuse", glm::vec3(0.8));
fragment->setVec3("lights[1].specular", glm::vec3(1.0));
fragment->setBool("lights[1].attenuate", false);
fragment->setVec3("lights[1].attenuation", glm::vec3(1.0, 0.09, 0.032));
glUniform3f(glGetUniformLocation(vertex->program, "cameraPosition"), camera_pos.x, camera_pos.y, camera_pos.z);
fragment->setVec3("material.specular", glm::vec3(0.7));
fragment->setVec3("material.diffuse", glm::vec3(1.0, 1.0, 0.8));
fragment->setVec3("material.ambient", glm::vec3(0.1));
fragment->setFloat("material.shininess", 32);
shader->use();
glUniform3f(glGetUniformLocation(shader->program, "objectColour"), 1.0f, 0.5f, 0.31f);
shader->setInt("lights[0].type", 0);
shader->setFloat("lights[0].angle_cutoff", glm::cos(glm::radians(12.5f)));
shader->setFloat("lights[0].outer_angle_cutoff", glm::cos(glm::radians(17.5f)));
shader->setVec3("lights[0].direction", glm::vec3(0,1,0));
shader->setVec3("lights[0].position", camera_pos);
shader->setVec3("lights[0].ambient", glm::vec3(0.3));
shader->setVec3("lights[0].diffuse", glm::vec3(0.8));
shader->setVec3("lights[0].specular", glm::vec3(1.0));
shader->setBool("lights[0].attenuate", true);
shader->setVec3("lights[0].attenuation", glm::vec3(1.0, 0.09, 0.032));
shader->setInt("num_lights", 2);
shader->setInt("lights[1].type", 1);
shader->setVec3("lights[1].position", lightPositions[0]);
shader->setVec3("lights[1].ambient", glm::vec3(0.3));
shader->setVec3("lights[1].diffuse", glm::vec3(0.8));
shader->setVec3("lights[1].specular", glm::vec3(1.0));
shader->setBool("lights[1].attenuate", false);
shader->setVec3("lights[1].attenuation", glm::vec3(1.0, 0.09, 0.032));
glUniform3f(glGetUniformLocation(shader->program, "cameraPosition"), camera_pos.x, camera_pos.y, camera_pos.z);
shader->setVec3("material.specular", glm::vec3(0.7));
shader->setVec3("material.diffuse", glm::vec3(1.0, 0.7, 0.8));
shader->setVec3("material.ambient", glm::vec3(0.4));
shader->setFloat("material.shininess", 32);
/***** Light Attenuation
*
@ -423,15 +411,30 @@ class SDLGLGLWindow { @@ -423,15 +411,30 @@ class SDLGLGLWindow {
*/
// set col
glUniform4f(vertexcol, 0.0f, green, 0.0f, 1.0f);
//Set vertex data
glBindVertexArray(gVAO);
/* set phong values */
fragment->setBool("lighting_emit", false);
shader->setBool("lighting_emit", false);
glm::mat4 model = glm::mat4(1.0f);
unsigned int loc = shader->get_uniform("model");
glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(model));
loc = shader->get_uniform("view");
glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(view));
loc = shader->get_uniform("projection");
glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(projection));
bp_model->draw(*shader);
return;
/*
for (int i = 0; i < 10; i++) {
glm::mat4 model = glm::mat4(1.0f);
@ -452,7 +455,7 @@ class SDLGLGLWindow { @@ -452,7 +455,7 @@ class SDLGLGLWindow {
}
glBindVertexArray(lightVAO);
fragment->setBool("lighting_emit", true);
shader->setBool("lighting_emit", true);
for (glm::vec3 pos : lightPositions) {
model = glm::mat4(1.0f);
@ -468,7 +471,9 @@ class SDLGLGLWindow { @@ -468,7 +471,9 @@ class SDLGLGLWindow {
//glDisableVertexAttribArray( gVertexPos2DLocation );
//Unbind program
//
glUseProgram( NULL );
*/
}
@ -480,14 +485,12 @@ class SDLGLGLWindow { @@ -480,14 +485,12 @@ class SDLGLGLWindow {
~SDLGLGLWindow() {
//Deallocate program
glDeleteProgram( gProgramID );
//Destroy window
SDL_DestroyWindow( gWindow );
gWindow = NULL;
delete vertex;
delete fragment;
delete shader;
//Quit SDL subsystems
SDL_Quit();

254
src/main1.bak

@ -1,254 +0,0 @@ @@ -1,254 +0,0 @@
#include <SDL2/SDL.h>
//Using SDL, SDL OpenGL, standard IO, and, strings
#include <GL/glew.h>
#include <SDL2/SDL_opengl.h>
#include <GL/glu.h>
#include <string>
#include <iostream>
#include <stdio.h>
#include "shaders.h"
void printProgramLog( GLuint program )
{
//Make sure name is shader
if( glIsProgram( program ) )
{
//Program log length
int infoLogLength = 0;
int maxLength = infoLogLength;
//Get info string length
glGetProgramiv( program, GL_INFO_LOG_LENGTH, &maxLength );
//Allocate string
char* infoLog = new char[ maxLength ];
//Get info log
glGetProgramInfoLog( program, maxLength, &infoLogLength, infoLog );
if( infoLogLength > 0 )
{
//Print Log
printf( "%s\n", infoLog );
}
//Deallocate string
delete[] infoLog;
}
else
{
printf( "Name %d is not a program\n", program );
}
}
class SDLGLGLWindow {
GLuint gProgramID = 0;
GLint gVertexPos2DLocation = -1;
/* array buffers */
GLuint gVBO = 0;
GLuint gIBO = 0;
GLuint gVAO = 0;
public:
int screen_width;
int screen_height;
SDL_Window *gWindow;
SDLGLGLWindow(int width, int height) {
screen_width = width;
screen_height = height;
if (!create_gl_window()) {
exit(1);
}
}
int create_gl_window() {
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 1 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK,
SDL_GL_CONTEXT_PROFILE_CORE );
gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, screen_width, screen_height,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN );
auto gContext = SDL_GL_CreateContext( gWindow );
if( gContext == NULL ) {
std::cerr << "OpenGL context could not be created! SDL Error: "
<< SDL_GetError() << std::endl ;
return false;
}
glewExperimental = GL_TRUE;
GLenum glewError = glewInit();
if( glewError != GLEW_OK )
{
std::cerr << "Error initializing GLEW! "
<< glewGetErrorString( glewError ) << std::endl;
}
//Use Vsync
if( SDL_GL_SetSwapInterval( 1 ) < 0 )
{
std::cerr << "Warning: Unable to set VSync! SDL Error: "
<< SDL_GetError() << std::endl;
}
//Initialize OpenGL
if( !initGL() )
{
std::cerr << "Unable to initialie OpenGL!" << std::endl;
return false;
}
return true;
}
int initGL() {
//Success flag
bool success = true;
//Generate program
gProgramID = glCreateProgram();
Shader vertex {GL_VERTEX_SHADER, gProgramID, "src/shaders/test.vert"};
Shader fragment {GL_FRAGMENT_SHADER, gProgramID, "src/shaders/test.frag"};
//Link program
glLinkProgram( gProgramID );
//Check for errors
GLint programSuccess = GL_TRUE;
glGetProgramiv( gProgramID, GL_LINK_STATUS, &programSuccess );
if( programSuccess != GL_TRUE )
{
printf( "Error linking program %d!\n", gProgramID );
printProgramLog(gProgramID);
return false;
}
gVertexPos2DLocation = glGetAttribLocation( gProgramID, "LVertexPos2D" );
if( gVertexPos2DLocation == -1 )
{
printf( "LVertexPos2D is not a valid glsl program variable!\n" );
return false;
}
//VBO data
GLfloat vertexData[] =
{
-0.5f, -0.5f,
0.5f, -0.5f,
0.5f, 0.5f,
-0.5f, 0.2f
};
//IBO data
GLuint indexData[] = { 0, 1, 2, 3 };
//Create VBO
glGenBuffers( 1, &gVBO );
glBindBuffer( GL_ARRAY_BUFFER, gVBO );
glBufferData( GL_ARRAY_BUFFER, sizeof vertexData, vertexData, GL_STATIC_DRAW );
//Create IBO
glGenBuffers( 1, &gIBO );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, gIBO );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof indexData, indexData, GL_STATIC_DRAW );
return success;
}
void render()
{
//Initialize clear color
glClearColor( 0.4f, 0.2f, 0.1f, 1.f );
//Clear color buffer
glClear( GL_COLOR_BUFFER_BIT );
//Bind program
glUseProgram( gProgramID );
//Set vertex data
glBindBuffer( GL_ARRAY_BUFFER, gVBO );
glVertexAttribPointer( gVertexPos2DLocation, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), NULL);
//Enable vertex position
glEnableVertexAttribArray( gVertexPos2DLocation );
//Set index data and render
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, gIBO );
glDrawElements( GL_TRIANGLE_FAN, 4, GL_UNSIGNED_INT, NULL );
//Disable vertex position
glDisableVertexAttribArray( gVertexPos2DLocation );
//Unbind program
glUseProgram( NULL );
}
void
swap_window()
{
SDL_GL_SwapWindow(gWindow);
}
~SDLGLGLWindow() {
//Deallocate program
glDeleteProgram( gProgramID );
//Destroy window
SDL_DestroyWindow( gWindow );
gWindow = NULL;
//Quit SDL subsystems
SDL_Quit();
}
};
int main(int argc, char **argv) {
SDLGLGLWindow cont {640, 480};
bool quit = false;
//Event handler
SDL_Event e;
//Enable text input
SDL_StartTextInput();
//While application is running
while( !quit )
{
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_QUIT )
{
quit = true;
}
}
//Render quad
cont.render();
//Update screen
cont.swap_window();
}
return 0;
}

267
src/main2.bak

@ -1,267 +0,0 @@ @@ -1,267 +0,0 @@
#include <SDL2/SDL.h>
//Using SDL, SDL OpenGL, standard IO, and, strings
#include <GL/glew.h>
#include <SDL2/SDL_opengl.h>
#include <GL/glu.h>
#include <string>
#include <iostream>
#include <stdio.h>
#include "shaders.h"
void printProgramLog( GLuint program )
{
//Make sure name is shader
if( glIsProgram( program ) )
{
//Program log length
int infoLogLength = 0;
int maxLength = infoLogLength;
//Get info string length
glGetProgramiv( program, GL_INFO_LOG_LENGTH, &maxLength );
//Allocate string
char* infoLog = new char[ maxLength ];
//Get info log
glGetProgramInfoLog( program, maxLength, &infoLogLength, infoLog );
if( infoLogLength > 0 )
{
//Print Log
printf( "%s\n", infoLog );
}
//Deallocate string
delete[] infoLog;
}
else
{
printf( "Name %d is not a program\n", program );
}
}
class SDLGLGLWindow {
GLuint gProgramID = 0;
GLint gVertexPos2DLocation = -1;
/* array buffers */
GLuint gVBO = 0;
GLuint gIBO = 0;
GLuint gVAO = 0;
public:
int screen_width;
int screen_height;
SDL_Window *gWindow;
SDLGLGLWindow(int width, int height) {
screen_width = width;
screen_height = height;
if (!create_gl_window()) {
exit(1);
}
}
int create_gl_window() {
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 1 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK,
SDL_GL_CONTEXT_PROFILE_CORE );
gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, screen_width, screen_height,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN );
auto gContext = SDL_GL_CreateContext( gWindow );
if( gContext == NULL ) {
std::cerr << "OpenGL context could not be created! SDL Error: "
<< SDL_GetError() << std::endl ;
return false;
}
glewExperimental = GL_TRUE;
GLenum glewError = glewInit();
if( glewError != GLEW_OK )
{
std::cerr << "Error initializing GLEW! "
<< glewGetErrorString( glewError ) << std::endl;
}
//Use Vsync
if( SDL_GL_SetSwapInterval( 1 ) < 0 )
{
std::cerr << "Warning: Unable to set VSync! SDL Error: "
<< SDL_GetError() << std::endl;
}
//Initialize OpenGL
if( !initGL() )
{
std::cerr << "Unable to initialie OpenGL!" << std::endl;
return false;
}
return true;
}
int initGL() {
//Success flag
bool success = true;
//Generate program
gProgramID = glCreateProgram();
Shader vertex {GL_VERTEX_SHADER, gProgramID, "src/shaders/test.vert"};
Shader fragment {GL_FRAGMENT_SHADER, gProgramID, "src/shaders/test.frag"};
//Link program
glLinkProgram( gProgramID );
//Check for errors
GLint programSuccess = GL_TRUE;
glGetProgramiv( gProgramID, GL_LINK_STATUS, &programSuccess );
if( programSuccess != GL_TRUE )
{
printf( "Error linking program %d!\n", gProgramID );
printProgramLog(gProgramID);
return false;
}
gVertexPos2DLocation = glGetAttribLocation( gProgramID, "LVertexPos2D" );
if( gVertexPos2DLocation == -1 )
{
printf( "LVertexPos2D is not a valid glsl program variable!\n" );
return false;
}
//Initialize clear color
glClearColor( 0.f, 0.f, 0.f, 1.f );
//VBO data
GLfloat vertexData[] =
{
-0.5f, -0.5f,
0.5f, -0.5f,
0.5f, 0.5f,
-0.5f, 0.5f,
};
//IBO data
GLuint indexData[] = { 0, 1, 2, 3 };
glGenVertexArrays(1, &gVAO);
glGenBuffers( 1, &gVBO );
glBindVertexArray(gVAO);
glBindBuffer(GL_ARRAY_BUFFER, gVBO);
glBufferData( GL_ARRAY_BUFFER, sizeof vertexData, vertexData, GL_STATIC_DRAW );
glVertexAttribPointer( gVertexPos2DLocation, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray( gVAO);
// unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
//Create IBO
glGenBuffers( 1, &gIBO );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, gIBO );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof indexData, indexData, GL_STATIC_DRAW );
printProgramLog(gProgramID);
return success;
}
void render()
{
//Clear color buffer
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
//Bind program
glUseProgram( gProgramID );
//Set vertex data
glBindVertexArray(gVAO);
// glBindBuffer( GL_ARRAY_BUFFER, gVBO );
//Enable vertex position
//Set index data and render
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, gIBO );
glDrawElements( GL_TRIANGLE_FAN, 4, GL_UNSIGNED_INT, NULL );
// glDrawArrays(GL_TRIANGLES, 0, 3);
//Disable vertex position
// glDisableVertexAttribArray( gVertexPos2DLocation );
//Unbind program
glUseProgram( NULL );
}
void
swap_window()
{
SDL_GL_SwapWindow(gWindow);
}
~SDLGLGLWindow() {
//Deallocate program
glDeleteProgram( gProgramID );
//Destroy window
SDL_DestroyWindow( gWindow );
gWindow = NULL;
//Quit SDL subsystems
SDL_Quit();
}
};
int main(int argc, char **argv) {
SDLGLGLWindow cont {640, 480};
bool quit = false;
//Event handler
SDL_Event e;
//Enable text input
SDL_StartTextInput();
//While application is running
while( !quit )
{
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_QUIT )
{
quit = true;
}
}
//Render quad
cont.render();
//Update screen
cont.swap_window();
}
return 0;
}

10
src/mesh.cpp

@ -10,6 +10,8 @@ Mesh::Mesh(std::vector<struct vertex> vertices, std::vector<unsigned int> indice @@ -10,6 +10,8 @@ Mesh::Mesh(std::vector<struct vertex> vertices, std::vector<unsigned int> indice
this->vertices = vertices;
this->indices = indices;
this->textures = textures;
setupMesh();
}
@ -24,10 +26,10 @@ void Mesh::setupMesh() @@ -24,10 +26,10 @@ void Mesh::setupMesh()
glBufferData( GL_ARRAY_BUFFER, vertices.size() * sizeof(vertex), &vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData( GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int),
&indices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex), (void*)0);
glEnableVertexAttribArray(1);
@ -43,7 +45,6 @@ void Mesh::setupMesh() @@ -43,7 +45,6 @@ void Mesh::setupMesh()
void Mesh::draw(Shader &shader) {
unsigned int specularNr = 1;
unsigned int diffuseNr = 1;
/*
for(unsigned int i = 0; i < textures.size(); i++)
{
glActiveTexture(GL_TEXTURE0 + i); // activate proper texture unit before binding
@ -58,13 +59,12 @@ void Mesh::draw(Shader &shader) { @@ -58,13 +59,12 @@ void Mesh::draw(Shader &shader) {
shader.setFloat(("material." + name + number).c_str(), i);
glBindTexture(GL_TEXTURE_2D, textures[i].id);
}
glActiveTexture(GL_TEXTURE0);
*/
// draw mesh
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
glActiveTexture(GL_TEXTURE0);
}

1
src/mesh.h

@ -51,6 +51,7 @@ class Model { @@ -51,6 +51,7 @@ class Model {
std::vector<texture> textures_loaded;
unsigned int texture_from_file(const char *fname, std::string directory);
void load_model(std::string path);
void process_node(aiNode *node, const aiScene *scene);
Mesh process_mesh(aiMesh *mesh, const aiScene *scene);

63
src/shaders.cpp

@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
#include <vector>
bool Shader::handle_error()
bool Shader::handle_error(std::string &filename)
{
GLint fShaderCompiled = GL_FALSE;
glGetShaderiv( shader, GL_COMPILE_STATUS, &fShaderCompiled );
@ -25,12 +25,10 @@ bool Shader::handle_error() @@ -25,12 +25,10 @@ bool Shader::handle_error()
return true;
}
Shader::Shader(GLuint type, std::string filename)
: type{type}
void Shader::add_shader(GLuint type, std::string filename)
{
shader = glCreateShader(type);
this->filename = filename;
// read source
std::ifstream source_file(filename, std::fstream::in);
@ -47,24 +45,49 @@ Shader::Shader(GLuint type, std::string filename) @@ -47,24 +45,49 @@ Shader::Shader(GLuint type, std::string filename)
const char *cstr = source.c_str();
glShaderSource(shader, 1, &cstr, NULL);
glCompileShader(shader);
if (handle_error()) {
if (handle_error(filename)) {
// compilation failed
glDeleteShader(shader);
throw std::exception();
}
glAttachShader(program, shader);
}
Shader::Shader(GLuint type, GLuint programID, std::string filename):
Shader(type, filename)
Shader::Shader()
{
this->program = programID;
attach(programID);
program = glCreateProgram();
}
void Shader::attach(GLuint program) {
glAttachShader(program, shader);
Shader::Shader(std::string filename)
{
program = glCreateProgram();
add_shader(GL_VERTEX_SHADER, filename);
}
Shader::Shader(std::string filename, std::string filename2)
{
program = glCreateProgram();
add_shader(GL_VERTEX_SHADER, filename);
add_shader(GL_FRAGMENT_SHADER, filename2);
link();
}
void Shader::link() {
glLinkProgram(program);
//Check for errors
GLint programSuccess = GL_TRUE;
glGetProgramiv( program, GL_LINK_STATUS, &programSuccess );
if( programSuccess != GL_TRUE )
{
printf( "Error linking program %d!\n", program );
throw std::exception();
}
}
void Shader::use() {
@ -99,3 +122,19 @@ void Shader::setVec3(const std::string &name, glm::vec3 vec) { @@ -99,3 +122,19 @@ void Shader::setVec3(const std::string &name, glm::vec3 vec) {
glUniform3f(glGetUniformLocation(program, name.c_str()), vec.x, vec.y, vec.z);
}
GLint Shader::get_attrib(std::string attrib)
{
return glGetAttribLocation(program, attrib.c_str());
}
GLint Shader::get_uniform(std::string unif)
{
return glGetUniformLocation(program, unif.c_str());
}
Shader::~Shader() {
glDeleteProgram(program);
}

14
src/shaders.h

@ -17,19 +17,21 @@ class Shader { @@ -17,19 +17,21 @@ class Shader {
std::string source;
std::string filename;
bool handle_error();
bool handle_error(std::string &filename);
public:
GLuint program = 0;
GLuint shader;
GLuint type;
Shader(GLuint type, std::string filename);
Shader();
Shader(std::string filename);
Shader(std::string filename, std::string filename2);
~Shader();
Shader(GLuint type, GLuint programID, std::string filename);
void attach(GLuint programID);
void use();
void link();
void add_shader(GLuint type, std::string filename);
void set(const std::string &name, float value);
void set(const std::string &name, bool value);
@ -38,5 +40,7 @@ class Shader { @@ -38,5 +40,7 @@ class Shader {
void setBool(const std::string &name, bool value);
void setInt(const std::string &name, int value);
void setVec3(const std::string &name, glm::vec3 vec);
GLint get_attrib(std::string attribute_name);
GLint get_uniform(std::string uniform_name);
};
#endif

8
src/shaders/test.frag

@ -12,15 +12,15 @@ uniform int lighting_emit; @@ -12,15 +12,15 @@ uniform int lighting_emit;
//uniform vec3 lightPosition;
uniform vec3 cameraPosition;
uniform sampler2D texture_diffuse1;
struct Material {
sampler2D diffusemap;
sampler2D specularmap;
sampler2D texture_diffuse1;
sampler2D texture_diffuse2;
sampler2D texture_diffuse3;
sampler2D texture_specular1;
sampler2D texture_specular2;
sampler2D texture_specular3;
vec3 ambient;
vec3 diffuse;
vec3 specular;
@ -76,7 +76,7 @@ void main() @@ -76,7 +76,7 @@ void main()
// specular
float spec = max(dot(normalize(cameraPosition - FragPos), reflect(-lightDir, norm)), 0.0);
spec = pow(spec, material.shininess);
vec3 specular = lights[i].specular * (spec * vec3(texture(material.specularmap, theTexCoord)));
vec3 specular = lights[i].specular * (spec * vec3(texture(material.texture_specular1, theTexCoord)));
vec3 result;
@ -105,6 +105,6 @@ void main() @@ -105,6 +105,6 @@ void main()
}
LFragment = (vec4(endResult, 1.0)) * texture(material.diffusemap, theTexCoord);
LFragment = (vec4(endResult, 1.0)) * texture(material.texture_diffuse1, theTexCoord);
}

6
src/shaders/test.vert

@ -1,8 +1,8 @@ @@ -1,8 +1,8 @@
#version 330 core
layout (location = 0) in vec3 LVertexPos2D;
layout (location = 1) in vec2 texCoord;
layout (location = 2) in vec3 aNormal;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoords;
out vec2 theTexCoord;
@ -16,7 +16,7 @@ out vec3 FragPos; @@ -16,7 +16,7 @@ out vec3 FragPos;
void main()
{
gl_Position = projection * view * model * vec4( LVertexPos2D, 1.0);
theTexCoord = texCoord;
theTexCoord = aTexCoords;
Normal = mat3(transpose(inverse(model))) * aNormal;
FragPos = vec3(model * vec4(LVertexPos2D, 1.0));
}

Loading…
Cancel
Save