Jump to content
  • Advertisement
Sign in to follow this  
Tonyx97

OpenGL Texture Disappears When I Load Any Type Of Shader (Lighting Shader In This Case)

This topic is 886 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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 this15653cc98cb2fccc91945e04726c3cf6.png

 

And when I load the shaders of lighting (or any simple shader) happens this:

a31eb34f55ff03d472284b323d54d8ea.png

 

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.

Edited by Tonyx97

Share this post


Link to post
Share on other sites
Advertisement

Disable the shader program after rendering whatever you want to render with it. Afaik binding a shader program disables all the fixed function pipeline stuff, you're binding it once and never unbinding it. Further draw calls will all be made with that program.

 

Doing that kinda mix and match of fixed function and programmable pipelines will end up in such issues. You should strive to use either one or the other. Preferably the latter. If you dont want to deal with such hassles, you can always grab a rendering engine that does it for you.

Share this post


Link to post
Share on other sites

Thanks you! At least now I know that was the problem and it's almost fixed. Now I've to figure out how to apply textures without shader (or with it) because I'm trying to glBindTexture but that's not even working. I've edited my rendering function like this:

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();


	Light.useProgram();
	glm::mat4 mModelView = Renderer->GetViewMatrix();
	glm::mat4 mModelToCamera;
	Light.setUniform("sunLight.vColor", glm::vec3(0.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));

	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)
			{
				glUseProgram(0);
				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();
			}


			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);


			Entities[i]->Mesh->render();


			glPopMatrix();
		}
	}
	glUseProgram(0);

	OGLImGui::DrawGUI();

	return TRUE;
}

and the "render" function of a mesh is (Entities->Mesh->render()):

void CMesh::MeshEntry::render()
{
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);

	glVertexPointer(3, GL_FLOAT, 0, (GLfloat*)VertexCoords.data());
	glNormalPointer(GL_FLOAT, 0, (GLfloat*)NormalCoords.data());
	glTexCoordPointer(2, GL_FLOAT, 0, (GLfloat*)TextureCoords.data());
	glBindTexture(GL_TEXTURE_2D, TextureManager::Texture[modelName]);

	glDrawArrays(GL_TRIANGLES, 0, VertexSize);											//ALWAYS GL_TRIANGLES (PROBABLY the ENGINE WILL SUPPORT QUAD IN THE FUTURE)

	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);

}

Also when I move the camera the entities are like "lagged", I don't know if that's a shader problem or I should edit the order of the code.. Now it's like this:

7b7a7d29f74965c03fc9212a2dfc2f61.jpg

Edited by Tonyx97

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!