Added shader-reflected Skybox

This commit is contained in:
Hugo Willaume 2019-04-03 15:06:37 +09:00
parent b129392d88
commit 91ccda04e4
7 changed files with 35 additions and 8 deletions

View File

@ -475,8 +475,9 @@ void Mesh::draw(SceneContext &ctx) {
shader->mat.shininess = shininess; shader->mat.shininess = shininess;
// Setting the space matrixes uniques to the object // Setting the space matrixes uniques to the object
ctx.mvpMatrix = ctx.projectionMatrix * ctx.viewMatrix * model.getMatrix(); ctx.modelMatrix = model.getMatrix();
ctx.modelViewMatrix = ctx.viewMatrix * model.getMatrix(); ctx.mvpMatrix = ctx.projectionMatrix * ctx.viewMatrix * ctx.modelMatrix;
ctx.modelViewMatrix = ctx.viewMatrix * ctx.modelMatrix;
ctx.normalMatrix = glm::mat3(glm::transpose(glm::inverse(ctx.modelViewMatrix))); ctx.normalMatrix = glm::mat3(glm::transpose(glm::inverse(ctx.modelViewMatrix)));
//Sending the uniform data to the shader //Sending the uniform data to the shader

View File

@ -110,6 +110,9 @@ void MyGlWindow::shaderSetup()
shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG; shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
shaders["Skybox"] = new Shader("skybox.vert", "skybox.frag"); shaders["Skybox"] = new Shader("skybox.vert", "skybox.frag");
shaders["Skybox"]->uniformFlags = MVP_FLAG | KA_FLAG | MODEL_MATRIX_FLAG | SKYBOX_TEX_FLAG;
shaders["Skybox"]->mat.enabled = true;
shaders["Skybox"]->mat.ka = glm::vec3(0.4, 0.4, 0.4);
} }
@ -137,6 +140,7 @@ void MyGlWindow::setup()
shaderSetup(); shaderSetup();
skybox.initialize("Models/Skybox/", shaders["Skybox"]); skybox.initialize("Models/Skybox/", shaders["Skybox"]);
skybox.scale = 10; skybox.scale = 10;
_scnctx.skybox_tex = skybox.getTexID();
lightSetup(); lightSetup();
//meshes.emplace("Ogre", new Mesh("ogre/ogre.obj", shaders["TexNmapLight"])); //meshes.emplace("Ogre", new Mesh("ogre/ogre.obj", shaders["TexNmapLight"]));
@ -191,6 +195,8 @@ void MyGlWindow::setup()
//meshes.emplace("Teapot", new Mesh("teapot.obj", shaders["Toon"])); //meshes.emplace("Teapot", new Mesh("teapot.obj", shaders["Toon"]));
//meshes["Teapot"]->addTranslation(glm::vec4(5, 0, 3, 1)); //meshes["Teapot"]->addTranslation(glm::vec4(5, 0, 3, 1));
//meshes["Teapot"]->cullMode = BACK; //meshes["Teapot"]->cullMode = BACK;
meshes.emplace("Teapot", new Mesh("teapot.obj", shaders["Skybox"]));
} }
@ -208,8 +214,8 @@ void MyGlWindow::draw()
_scnctx.viewMatrix = view; _scnctx.viewMatrix = view;
_scnctx.projectionMatrix = projection; _scnctx.projectionMatrix = projection;
//_scnctx.adjustSpots(); shaders["Skybox"]->addUniform("WorldCamPos", eye);
for (auto it = meshes.begin(); it != meshes.end(); it++) for (auto it = meshes.begin(); it != meshes.end(); it++)
(*it).second->draw(_scnctx); (*it).second->draw(_scnctx);
skybox.draw(shaders["Skybox"], _scnctx); skybox.draw(shaders["Skybox"], _scnctx);

View File

@ -16,8 +16,11 @@ struct SceneContext
glm::mat4x4 mvpMatrix; glm::mat4x4 mvpMatrix;
glm::mat4x4 modelViewMatrix; glm::mat4x4 modelViewMatrix;
glm::mat4x4 modelMatrix;
glm::mat3x3 normalMatrix; glm::mat3x3 normalMatrix;
GLuint skybox_tex;
std::map<std::string, Texture> textures; std::map<std::string, Texture> textures;
void adjustSpots() void adjustSpots()

View File

@ -39,6 +39,8 @@ void Shader::setCamera(SceneContext ctx)
glUniformMatrix3fv(_program.addUniform("NormalMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.normalMatrix)); glUniformMatrix3fv(_program.addUniform("NormalMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.normalMatrix));
if ((uniformFlags & ShaderFlags::MODELVIEW_FLAG) == ShaderFlags::MODELVIEW_FLAG) if ((uniformFlags & ShaderFlags::MODELVIEW_FLAG) == ShaderFlags::MODELVIEW_FLAG)
glUniformMatrix4fv(_program.addUniform("ModelViewMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.modelViewMatrix)); glUniformMatrix4fv(_program.addUniform("ModelViewMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.modelViewMatrix));
if ((uniformFlags & ShaderFlags::MODEL_MATRIX_FLAG) == ShaderFlags::MODEL_MATRIX_FLAG)
glUniformMatrix4fv(_program.addUniform("ModelMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.modelMatrix));
} }
void Shader::setLights(SceneContext ctx) void Shader::setLights(SceneContext ctx)
@ -72,4 +74,10 @@ void Shader::setUniforms(SceneContext ctx)
setCamera(ctx); setCamera(ctx);
setLights(ctx); setLights(ctx);
setMaterial(ctx); setMaterial(ctx);
if ((uniformFlags & ShaderFlags::SKYBOX_TEX_FLAG) == ShaderFlags::SKYBOX_TEX_FLAG)
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, ctx.skybox_tex);
}
} }

View File

@ -21,7 +21,9 @@ enum ShaderFlags
MVP_FLAG = 16, MVP_FLAG = 16,
NORMAL_MAT_FLAG = 32, NORMAL_MAT_FLAG = 32,
MODELVIEW_FLAG = 64, MODELVIEW_FLAG = 64,
LIGHTS_FLAG = 128, LIGHTS_FLAG = 128,
MODEL_MATRIX_FLAG = 256,
SKYBOX_TEX_FLAG = 512
}; };
class Shader class Shader

View File

@ -98,6 +98,8 @@ void Skybox::initialize(std::string skybox_dir, Shader *sky)
glBindTexture(GL_TEXTURE_CUBE_MAP, 0); glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
sky->enable(); sky->enable();
sky->addUniform("DrawSkyBox", (int)GL_FALSE); sky->addUniform("DrawSkyBox", (int)GL_FALSE);
sky->addUniform("CubeMapTex", (int)0);
sky->addUniform("ReflectFactor", (float)0.85);
sky->disable(); sky->disable();
} }
@ -108,6 +110,12 @@ Skybox::~Skybox()
glDeleteVertexArrays(1, &vao); glDeleteVertexArrays(1, &vao);
} }
// //Things to add
// //Per model :
// // - ModelMatrix
// // - MaterialColor
void Skybox::draw(Shader *sky_shader, SceneContext &ctx) void Skybox::draw(Shader *sky_shader, SceneContext &ctx)
{ {
sky_shader->enable(); sky_shader->enable();
@ -118,7 +126,6 @@ void Skybox::draw(Shader *sky_shader, SceneContext &ctx)
sky_shader->addUniform("mvp", mvpMatrix); sky_shader->addUniform("mvp", mvpMatrix);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, texID); glBindTexture(GL_TEXTURE_CUBE_MAP, texID);
sky_shader->addUniform("CubeMapTex", (int)0);
glBindVertexArray(vao); glBindVertexArray(vao);
sky_shader->addUniform("DrawSkyBox", (int)GL_TRUE); sky_shader->addUniform("DrawSkyBox", (int)GL_TRUE);

View File

@ -4,7 +4,7 @@ out vec4 FragColors;
in vec3 reflectDir; in vec3 reflectDir;
uniform vec3 MaterialColor; uniform vec3 Ka;
uniform float ReflectFactor; uniform float ReflectFactor;
uniform bool DrawSkyBox; uniform bool DrawSkyBox;
uniform samplerCube CubeMapTex; uniform samplerCube CubeMapTex;
@ -19,5 +19,5 @@ void main()
if (DrawSkyBox == true) if (DrawSkyBox == true)
FragColors = texColor; FragColors = texColor;
else else
FragColors = vec4(mix(texColor.xyz,MaterialColor,ReflectFactor), 1); FragColors = vec4(mix(Ka, texColor.xyz, ReflectFactor), 1);
} }