Almost got metallisism working I just don't know what's up with the textures again.

This commit is contained in:
Warwick 2022-07-19 14:58:02 +01:00
parent 7e3a7f0df7
commit 1e5544ce1f
14 changed files with 1708 additions and 22 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 952 KiB

View file

@ -0,0 +1,16 @@
# Blender MTL File: 'wooden_box_and_barrel.blend'
# Material Count: 1
newmtl Material.001
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Bump wooden box and barrel/boxes_DefaultMaterial_Normal.png
map_Kd wooden box and barrel/boxes_DefaultMaterial_BaseColor.png
map_Ns wooden box and barrel/boxes_DefaultMaterial_Roughness.png
map_Pm wooden box and barrel/boxes_DefaultMaterial_Metallic.png

File diff suppressed because it is too large Load diff

View file

@ -3,10 +3,10 @@ out vec4 FragColor;
in vec2 ourTexCoord; in vec2 ourTexCoord;
in vec3 ourNormCoord; in vec3 ourNormCoord;
in vec3 FragPos; in vec3 WorldPos;
// TODO: make temporary hard coded world/camera pos dynamic // TODO: make temporary hard coded world/camera pos dynamic
uniform vec3 WorldPos ; //uniform vec3 WorldPos ;
uniform vec3 CameraPos; uniform vec3 CameraPos;
uniform int tick; uniform int tick;
//vec3 WorldPos = vec3(0.0f, 0.0f, 0.0f); //vec3 WorldPos = vec3(0.0f, 0.0f, 0.0f);
@ -18,16 +18,17 @@ vec3 albedo = vec3(0.8f, 0.8f, 0.8f);
//float roughness = sin(tick / 60 * 0.3f); //float roughness = sin(tick / 60 * 0.3f);
//float ao = sin(tick / 60 * 0.8f); //float ao = sin(tick / 60 * 0.8f);
float metallic = 0.3f; //float metallic = 0.3f;
float roughness = 0.3f; float roughness = 0.3f;
float ao = 0.8f; float ao = 0.8f;
// Handle multiple textures from the Mesh Object (Might not even be used) // Handle multiple textures from the Mesh Object (Might not even be used)
uniform sampler2D texture_diffuse1; uniform sampler2D texture_diffuse1;
uniform sampler2D texture_diffuse2; uniform sampler2D texture_diffuse2;
uniform sampler2D texture_diffuse3;
uniform sampler2D texture_specular1; uniform sampler2D texture_specular1;
uniform sampler2D texture_specular2; uniform sampler2D texture_specular2;
uniform sampler2D texture_metalness1;
uniform sampler2D texture_metalness2;
// PBR functions from learnOpenGL.com // PBR functions from learnOpenGL.com
const float PI = 3.14159265359; const float PI = 3.14159265359;
@ -73,6 +74,7 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
void main() void main()
{ {
//albedo = vec3(texture(texture_diffuse1, ourTexCoord)); //albedo = vec3(texture(texture_diffuse1, ourTexCoord));
float metallic = texture(texture_metalness1, ourTexCoord).r;
// Establish ambient lighting // Establish ambient lighting
float ambientStrength = 0.1; float ambientStrength = 0.1;
@ -119,6 +121,7 @@ void main()
color = color / (color + vec3(1.0)); color = color / (color + vec3(1.0));
color = pow(color, vec3(1.0/2.2)); color = pow(color, vec3(1.0/2.2));
//FragColor = vec4(CameraPos, 1.0); //FragColor = texture(texture_diffuse1, ourTexCoord);
//FragColor = texture(texture_metalness1, ourTexCoord);
FragColor = texture(texture_diffuse1, ourTexCoord) * vec4(color, 0.0); FragColor = texture(texture_diffuse1, ourTexCoord) * vec4(color, 0.0);
} }

View file

@ -8,7 +8,7 @@ uniform mat4 Model;
out vec2 ourTexCoord; out vec2 ourTexCoord;
out vec3 ourNormCoord; out vec3 ourNormCoord;
out vec3 FragPos; out vec3 WorldPos;
void main() void main()
{ {
@ -17,5 +17,5 @@ void main()
ourTexCoord = aTexCoord; ourTexCoord = aTexCoord;
// Calculate position of fragment // Calculate position of fragment
FragPos = vec3(Model * vec4(aPos, 1.0)); WorldPos = vec3(Model * vec4(aPos, 1.0));
}; };

View file

@ -42,6 +42,7 @@ void Mesh::setupMesh() {
void Mesh::draw(ShaderLoader &shader) { void Mesh::draw(ShaderLoader &shader) {
unsigned int diffuseNr = 1; unsigned int diffuseNr = 1;
unsigned int specularNr = 1; unsigned int specularNr = 1;
unsigned int metalNr = 1;
for (unsigned int i = 0; i < textures.size(); i++) { for (unsigned int i = 0; i < textures.size(); i++) {
// activate proper texture unit before binding // activate proper texture unit before binding
glActiveTexture(GL_TEXTURE0 + i); glActiveTexture(GL_TEXTURE0 + i);
@ -52,9 +53,15 @@ void Mesh::draw(ShaderLoader &shader) {
number = std::to_string(diffuseNr++); number = std::to_string(diffuseNr++);
else if (name == "texture_specular") else if (name == "texture_specular")
number = std::to_string(specularNr++); number = std::to_string(specularNr++);
else if (name == "texture_metalness")
number = std::to_string(metalNr++);
shader.setFloat(("material." + name + number).c_str(), i); error.log(("material." + name + number).c_str() + std::string(" ") +
std::to_string(i) + " " + std::to_string(textures[i].id));
shader.setInt(("material." + name + number).c_str(), i);
glBindTexture(GL_TEXTURE_2D, textures[i].id); glBindTexture(GL_TEXTURE_2D, textures[i].id);
// error.log(std::to_string(i));
} }
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);

View file

@ -7,7 +7,6 @@ Model::Model(std::vector<Mesh> meshes) { this->meshes = meshes; }
void Model::draw(ShaderLoader &shader) { void Model::draw(ShaderLoader &shader) {
for (unsigned int i = 0; i < this->meshes.size(); i++) { for (unsigned int i = 0; i < this->meshes.size(); i++) {
shader.setMat4("Model", this->model); shader.setMat4("Model", this->model);
shader.setVec3("WorldPos", this->position);
this->meshes[i].draw(shader); this->meshes[i].draw(shader);
} }
} }
@ -101,7 +100,15 @@ Mesh Model::processMesh(aiMesh *mesh, const aiScene *scene) {
std::vector<Texture> specularMaps = loadMaterialTextures( std::vector<Texture> specularMaps = loadMaterialTextures(
material, aiTextureType_SPECULAR, "texture_specular"); material, aiTextureType_SPECULAR, "texture_specular");
textures.insert(textures.end(), specularMaps.begin(), specularMaps.end()); textures.insert(textures.end(), specularMaps.begin(), specularMaps.end());
std::vector<Texture> metalMaps = loadMaterialTextures(
material, aiTextureType_METALNESS, "texture_metalness");
textures.insert(textures.end(), metalMaps.begin(), metalMaps.end());
} }
error.log("Model");
error.log(textures[0].path);
error.log(std::to_string(textures[0].id));
error.log(textures[1].path);
error.log(std::to_string(textures[1].id));
return Mesh(vertices, indecies, textures); return Mesh(vertices, indecies, textures);
} }
@ -144,6 +151,7 @@ unsigned int Model::loadTextureFromFile(std::string file,
std::string directory) { std::string directory) {
// Use sdl2_image to load the texture. // Use sdl2_image to load the texture.
unsigned int texture; unsigned int texture;
error.log(file);
SDL_Surface *image = IMG_Load((directory + file).c_str()); SDL_Surface *image = IMG_Load((directory + file).c_str());
if (image == nullptr) { if (image == nullptr) {
error.crash("SDL2_image was unable to load a texture", IMG_GetError()); error.crash("SDL2_image was unable to load a texture", IMG_GetError());

View file

@ -69,15 +69,17 @@ int main(int argc, char **argv) {
ShaderLoader shader(ROOT_DIR "data/shaders/pbrVertex.glsl", ShaderLoader shader(ROOT_DIR "data/shaders/pbrVertex.glsl",
ROOT_DIR "data/shaders/pbrFragment.glsl"); ROOT_DIR "data/shaders/pbrFragment.glsl");
Model backpack(std::string(ROOT_DIR) + // Model backpack(std::string(ROOT_DIR) +
std::string("data/models/backpack/backpack.obj")); // std::string("data/models/backpack/backpack.obj"));
Model cube(ROOT_DIR "data/models/cube/cube.obj"); // Model cube(ROOT_DIR "data/models/cube/cube.obj");
Model gun(ROOT_DIR "data/models/gun/Cerberus_LP.FBX"); // Model gun(ROOT_DIR "data/models/gun/Cerberus_LP.FBX");
cube.translate(glm::vec3(3.0f, 0.0f, -1.0f)); Model boxbarrel(ROOT_DIR
backpack.translate(glm::vec3(-3.0f, 0.0f, 0.0f)); "data/models/wooden_boxbarrel/wooden_box_and_barrel.obj");
gun.translate(glm::vec3(0.0f, 1.0f, 0.0f)); // cube.translate(glm::vec3(3.0f, 0.0f, -1.0f));
gun.resize(glm::vec3(0.02f, 0.02f, 0.02f)); // backpack.translate(glm::vec3(-3.0f, 0.0f, 0.0f));
gun.rotate(glm::radians(-90.0f), glm::vec3(0.0f, 1.0f, 0.0f)); // gun.translate(glm::vec3(0.0f, 1.0f, 0.0f));
// gun.resize(glm::vec3(0.02f, 0.02f, 0.02f));
// gun.rotate(glm::radians(-90.0f), glm::vec3(0.0f, 1.0f, 0.0f));
// Create player camera object // Create player camera object
PlayerCamera camera; PlayerCamera camera;
@ -121,10 +123,10 @@ int main(int argc, char **argv) {
shader.setInt("tick", SDL_GetTicks()); shader.setInt("tick", SDL_GetTicks());
// Draw Meshes // Draw Meshes
cube.draw(shader); // cube.draw(shader);
backpack.draw(shader); // backpack.draw(shader);
gun.draw(shader); // gun.draw(shader);
boxbarrel.draw(shader);
// Finally render everything // Finally render everything
shader.use(); shader.use();