Hello guys, this is my first thread in the community (well I'm not sure haha, long time ago I didn't enter here), to be honest I never came to internet to ask something related with OpenGL since there are a lot of good sources to learn and I'm C++ programmer, but these shaders are a bit different or I'm doing something stupid... they are turning me crazy. I took the source from a good site where the everything works perfectly, I didn't modify the source of the shaders so the link of the example source is this. Basically the problem is when I load the shader, the texture disappears and there are some graphics problems. In the first case, the normal look of my project is this
And when I load the shaders of lighting (or any simple shader) happens this:
The shader is really working because the shadow of the entities are properly situated according to the position of the directional light.
I'm also using ImGui but that's not the problem because I commented the initializing function and the problem persists. I'm posting the source of the rendering function here:
BOOL DrawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//MESHES & SKYBOX RENDERING
CSkybox::RenderSkybox(0, 0, 0, 1, 1, 1);
Camera->UpdateCamera();
RenderSpaceLines();
for (uint i = 0; i < EntityManager::GetEntities(); i++)
{
if (Entities[i] && Entities[i]->ID != INT_MAX && Vector3::Distance(Camera->position, Entities[i]->Position) <= Renderer->GetRenderMaxDistance()) //AVOIDING RENDER ENTITIES THAT ARE OUTSIDE OF MAX DISTANCE
{
glPushMatrix();
if (Entities[i]->Parent == -1)
{
glTranslatef(Entities[i]->Position.x,
Entities[i]->Position.y,
Entities[i]->Position.z);
glRotatef(Entities[i]->Rotation.x, 1.f, 0.f, 0.f);
glRotatef(Entities[i]->Rotation.y, 0.f, 1.f, 0.f);
glRotatef(Entities[i]->Rotation.z, 0.f, 0.f, 1.f);
}
else
{
glTranslatef(Entities[Entities[i]->Parent]->Position.x,
Entities[Entities[i]->Parent]->Position.y,
Entities[Entities[i]->Parent]->Position.z);
glRotatef(Entities[Entities[i]->Parent]->Rotation.x, 1.f, 0.f, 0.f);
glRotatef(Entities[Entities[i]->Parent]->Rotation.y, 0.f, 1.f, 0.f);
glRotatef(Entities[Entities[i]->Parent]->Rotation.z, 0.f, 0.f, 1.f);
glTranslatef(Entities[i]->Position.x,
Entities[i]->Position.y,
Entities[i]->Position.z);
}
glScalef(Entities[i]->Scale.x,
Entities[i]->Scale.y,
Entities[i]->Scale.z);
if (Entities[i]->HasCollider && Entities[i]->ShowCollider)
{
glBindTexture(GL_TEXTURE_2D, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glPushMatrix();
if (Entities[i]->IsCollidingWithAnyEntity())
Entities[i]->ColliderColor = Color(1.f, 0.f, 0.f);
else
Entities[i]->ColliderColor = Color(0.f, 1.f, 0.f);
glColor3f(Entities[i]->ColliderColor.R(), Entities[i]->ColliderColor.G(), Entities[i]->ColliderColor.B());
if (Entities[i]->CollisionType == eCollisionType::ORIENTED_BOX || Entities[i]->CollisionType == eCollisionType::BOX)
{
glVertexPointer(3, GL_FLOAT, 0, NTV_LineCube);
glDrawArrays(GL_LINES, 0, 24);
}
else if (Entities[i]->CollisionType == eCollisionType::SPHERE)
{
glScalef(Entities[i]->Scale.x,
Entities[i]->Scale.y,
Entities[i]->Scale.z);
glVertexPointer(3, GL_FLOAT, 0, NTV_Sphere);
glDrawArrays(GL_POINTS, 0, 5952);
}
glColor3f(1.0f, 1.0f, 1.0f);
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY);
}
//Light.useProgram();
//problem starts here
glm::mat4 mModelView = Renderer->GetViewMatrix();
glm::mat4 mModelToCamera;
Light.setUniform("sunLight.vColor", glm::vec3(1.0f, 1.0f, 1.0f));
Light.setUniform("sunLight.fAmbientIntensity", 0.95f);
Light.setUniform("sunLight.vDirection", -glm::normalize(glm::vec3(5.f, 1.f, 0)));
Light.setUniform("projectionMatrix", Renderer->GetProjectionMatrix());
Light.setUniform("gSampler", 0);
Light.setUniform("modelViewMatrix", &mModelView);
Light.setUniform("vColor", glm::vec4(0.0f, 1.0f, 1.0f, 1.0f));
glm::vec3 vPos = glm::vec3(Entities[i]->Position.x, Entities[i]->Position.y, Entities[i]->Position.z);
mModelToCamera = glm::translate(glm::mat4(1.0), vPos);
mModelToCamera = glm::rotate(mModelToCamera, 0.f, glm::vec3(0.0f, 1.0f, 0.0f));
Light.setUniform("normalMatrix", glm::transpose(glm::inverse(mModelToCamera)));
Light.setUniform("modelViewMatrix", mModelView*mModelToCamera);
//problem "finish" here (lol)
Entities[i]->Mesh->render();
glPopMatrix();
}
}
OGLImGui::DrawGUI();
return TRUE;
}
When this code is reach the shaders are loaded properly and I use glUseProgram to enable them before any rendering. I tried to change the order of the lines since OpenGL is very sensitive with the order but still nothing. Maybe I am missing something, I'm not sure. Does anyone know what could be the problem? if any other code is needed ask please.
Thanks in advance.