|
|
|
@ -154,6 +154,7 @@ class SDLGLGLWindow {
@@ -154,6 +154,7 @@ class SDLGLGLWindow {
|
|
|
|
|
glm::mat4 view = glm::mat4(1.0f); |
|
|
|
|
private: |
|
|
|
|
Shader *shader; |
|
|
|
|
Shader *modelShader; |
|
|
|
|
Shader *texShader; |
|
|
|
|
Shader *skyboxShader; |
|
|
|
|
Model *bp_model; |
|
|
|
@ -270,6 +271,7 @@ class SDLGLGLWindow {
@@ -270,6 +271,7 @@ class SDLGLGLWindow {
|
|
|
|
|
bool success = true; |
|
|
|
|
//Generate program
|
|
|
|
|
shader = new Shader("src/shaders/instanced.vert", "src/shaders/test.frag"); |
|
|
|
|
modelShader = new Shader("src/shaders/instanced.vert", "src/shaders/test.frag"); |
|
|
|
|
texShader = new Shader("src/shaders/screentexture.vert", "src/shaders/screentexture.frag"); |
|
|
|
|
skyboxShader = new Shader("src/shaders/sky.vert", "src/shaders/sky.frag"); |
|
|
|
|
glCheckError(); |
|
|
|
@ -277,10 +279,11 @@ class SDLGLGLWindow {
@@ -277,10 +279,11 @@ class SDLGLGLWindow {
|
|
|
|
|
//Link program
|
|
|
|
|
stbi_set_flip_vertically_on_load(true); |
|
|
|
|
|
|
|
|
|
modelShader->use(); |
|
|
|
|
bp_model = new Model("src/assets/objects/backpack/backpack.obj"); |
|
|
|
|
glCheckError(); |
|
|
|
|
shader->use(); |
|
|
|
|
|
|
|
|
|
// 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); |
|
|
|
|
|
|
|
|
@ -377,7 +380,8 @@ class SDLGLGLWindow {
@@ -377,7 +380,8 @@ class SDLGLGLWindow {
|
|
|
|
|
int width, height, nrChannels; |
|
|
|
|
stbi_set_flip_vertically_on_load(true); |
|
|
|
|
glGenTextures(2, texture); |
|
|
|
|
unsigned char *data = stbi_load("src/assets/container.jpg", &width, &height, &nrChannels, 0); |
|
|
|
|
unsigned char *data = stbi_load("src/assets/Tiles01-1k/Tiles01 diffuse 1k.jpg", &width, &height, &nrChannels, 0); |
|
|
|
|
unsigned char *datanorm = stbi_load("src/assets/Tiles01-1k/Tiles01 normal 1k.jpg", &width, &height, &nrChannels, 0); |
|
|
|
|
|
|
|
|
|
if (data) {
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture[0]); |
|
|
|
@ -394,46 +398,46 @@ class SDLGLGLWindow {
@@ -394,46 +398,46 @@ class SDLGLGLWindow {
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
|
|
|
|
glCheckError(); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
throw std::exception () ; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
data = stbi_load("src/assets/grass.png", &width, &height, &nrChannels, 0); |
|
|
|
|
if (data) |
|
|
|
|
{ |
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture[1]); |
|
|
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); |
|
|
|
|
|
|
|
|
|
glGenerateMipmap(GL_TEXTURE_2D); |
|
|
|
|
stbi_image_free(data); |
|
|
|
|
/* load normal */ |
|
|
|
|
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture[1]); |
|
|
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, datanorm); |
|
|
|
|
glGenerateMipmap(GL_TEXTURE_2D); |
|
|
|
|
stbi_image_free(datanorm); |
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); |
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
|
|
|
|
} else { |
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
throw std::exception () ; |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture[0]); |
|
|
|
|
glCheckError(); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
glActiveTexture(GL_TEXTURE1); |
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture[1]); |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
shader->use(); |
|
|
|
|
shader->setInt("material.texture_diffuse1", 0); |
|
|
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0 + 1); |
|
|
|
|
shader->setInt("material.texture_normal1", 1); |
|
|
|
|
|
|
|
|
|
glCheckError(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// shader->setInt("material.specularmap", 1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
shader->setBool("lighting_emit", false); |
|
|
|
|
|
|
|
|
|
float cubeVertices[] = { |
|
|
|
|
// vertices normals textures
|
|
|
|
|
// vertices normals textures tangent
|
|
|
|
|
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, |
|
|
|
|
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, |
|
|
|
|
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, |
|
|
|
@ -613,6 +617,25 @@ class SDLGLGLWindow {
@@ -613,6 +617,25 @@ class SDLGLGLWindow {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
glCheckError(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modelShader->setInt("num_lights", 1); |
|
|
|
|
modelShader->setInt("lights[0].type", 0); |
|
|
|
|
modelShader->setFloat("lights[0].angle_cutoff", glm::cos(glm::radians(12.5f))); |
|
|
|
|
modelShader->setFloat("lights[0].outer_angle_cutoff", glm::cos(glm::radians(17.5f))); |
|
|
|
|
|
|
|
|
|
modelShader->setVec3("lights[0].direction", glm::vec3(0,-1,0)); |
|
|
|
|
modelShader->setVec3("lights[0].position", camera_pos); |
|
|
|
|
|
|
|
|
|
modelShader->setVec3("lights[0].ambient", glm::vec3(0.1)); |
|
|
|
|
modelShader->setVec3("lights[0].diffuse", glm::vec3(0.8,0.7,1.0) * glm::vec3(0.5)); |
|
|
|
|
modelShader->setVec3("lights[0].specular", glm::vec3(1.0)); |
|
|
|
|
modelShader->setBool("lights[0].attenuate", false); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
shader->setInt("num_lights", 3); |
|
|
|
|
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))); |
|
|
|
@ -625,7 +648,6 @@ class SDLGLGLWindow {
@@ -625,7 +648,6 @@ class SDLGLGLWindow {
|
|
|
|
|
shader->setVec3("lights[0].specular", glm::vec3(1.0)); |
|
|
|
|
shader->setBool("lights[0].attenuate", false); |
|
|
|
|
// shader->setVec3("lights[0].attenuation", glm::vec3(1.0, 0.09, 0.032));
|
|
|
|
|
shader->setInt("num_lights", 3); |
|
|
|
|
shader->setInt("lights[1].type", 1); |
|
|
|
|
shader->setVec3("lights[1].position", lightPositions[0]); |
|
|
|
|
|
|
|
|
@ -651,6 +673,11 @@ class SDLGLGLWindow {
@@ -651,6 +673,11 @@ class SDLGLGLWindow {
|
|
|
|
|
shader->setFloat("material.shininess", 32); |
|
|
|
|
glCheckError(); |
|
|
|
|
|
|
|
|
|
modelShader->setVec3("material.specular", glm::vec3(0.7)); |
|
|
|
|
modelShader->setVec3("material.diffuse", glm::vec3(1.0, 0.7, 0.8)); |
|
|
|
|
modelShader->setVec3("material.ambient", glm::vec3(0.2)); |
|
|
|
|
modelShader->setFloat("material.shininess", 32); |
|
|
|
|
|
|
|
|
|
/***** Light Attenuation
|
|
|
|
|
* |
|
|
|
|
* Constant x, Linear y, Quadratic z |
|
|
|
@ -699,14 +726,20 @@ class SDLGLGLWindow {
@@ -699,14 +726,20 @@ class SDLGLGLWindow {
|
|
|
|
|
glCheckError(); |
|
|
|
|
|
|
|
|
|
model = glm::mat4(1.0); |
|
|
|
|
loc = shader->get_uniform("model"); |
|
|
|
|
model = glm::rotate(model, glm::radians( 20.0f + 160.0f *(float)SDL_GetTicks() / 1000.0f), glm::vec3(0.6, 0.3, 1.0)); |
|
|
|
|
glCheckError(); |
|
|
|
|
loc = modelShader->get_uniform("model"); |
|
|
|
|
glCheckError(); |
|
|
|
|
glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(model)); |
|
|
|
|
glCheckError(); |
|
|
|
|
|
|
|
|
|
loc = shader->get_uniform("view"); |
|
|
|
|
loc = modelShader->get_uniform("view"); |
|
|
|
|
glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(view)); |
|
|
|
|
glCheckError(); |
|
|
|
|
|
|
|
|
|
loc = modelShader->get_uniform("projection"); |
|
|
|
|
glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(projection)); |
|
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_CUBE_MAP, cubemap); |
|
|
|
|
|
|
|
|
|
bp_model->draw(*shader); |
|
|
|
@ -714,8 +747,14 @@ class SDLGLGLWindow {
@@ -714,8 +747,14 @@ class SDLGLGLWindow {
|
|
|
|
|
|
|
|
|
|
//*** Draw random cubes ****/
|
|
|
|
|
shader->use(); |
|
|
|
|
|
|
|
|
|
glBindVertexArray(gVAO); |
|
|
|
|
glActiveTexture(GL_TEXTURE0); // activate proper texture unit before binding
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture[0]); |
|
|
|
|
shader->setInt("material.texture_diffuse1", 0); |
|
|
|
|
glActiveTexture(GL_TEXTURE0 + 1); // activate proper texture unit before binding
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture[1]); |
|
|
|
|
shader->setInt("material.texture_normal1", 1); |
|
|
|
|
glCheckError(); |
|
|
|
|
glDrawArraysInstanced(GL_TRIANGLES, 0,36,1000); |
|
|
|
|
glCheckError(); |
|
|
|
|