Jump to content

  • Log In with Google      Sign In   
  • Create Account


incorrect lighting (normals)


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
No replies to this topic

#1 proanim   Members   -  Reputation: 437

Like
0Likes
Like

Posted 20 January 2013 - 08:00 PM

Until now everything was going ok with my program, until I tried to implement simple directional lighting. I am not exactly sure where is the problem. I checked everything. I get this

 

 

clipboard01toq.jpg
 
The thing on the right supposed to be torus (???)
 
Now my rendering function look like this
 
void RenderScene()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glEnable(GL_TEXTURE_2D);
	spDirLight.useProgram();
	glBindVertexArray(uiVAO[0]);

	// set light properties
	float fSine = sin(SunAngle*3.1415/180.0);
	glm::vec3 vSunPos(cos(SunAngle*3.1415/180.0)*70, sin(SunAngle*3.1415/180.0)*70, 0.0);

	// change color of sky depending on sun's position
	glClearColor(0.0f, std::max(0.0f, 0.9f*fSine), std::max(0.0f, 0.9f*fSine), 1.0f);

	spDirLight.setUniform("sunLight.vColor", glm::vec3(1.0f, 1.0f, 1.0f));
	spDirLight.setUniform("sunLight.fAmbientIntensity", 0.25f);
	spDirLight.setUniform("sunLight.vDirection", -glm::normalize(vSunPos));
	spDirLight.setUniform("projectionMatrix", &mProjection);

	mProjection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 1000.0f);
	mModelView = CameraLook(vEye, vView, vUp);

	spDirLight.setUniform("gSampler", 0);
	spDirLight.setUniform("modelViewMatrix", &mModelView);
	spDirLight.setUniform("vColor", glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));

	// render ground
	tTextures[0].bindTexture();
	glDrawArrays(GL_TRIANGLES, 36, 6);

	tTextures[1].bindTexture();

	glm::vec3 vPos = glm::vec3(0.0f, 0.0f, 0.0f);
	mModelToCamera = glm::translate(glm::mat4(1.0), vPos);
	mModelToCamera = glm::scale(mModelToCamera, glm::vec3(5.0f, 5.0f, 5.0f));
	// we need to trasnsform normals properly, it's done by transpose of inverse matrix of rotations and scales
	spDirLight.setUniform("normalMatrix", glm::transpose(glm::inverse(mModelToCamera)));
	spDirLight.setUniform("modelViewMatrix", mModelView*mModelToCamera);

	glDrawArrays(GL_TRIANGLES, 0, 36);

	// render torus
	tTextures[2].bindTexture();

	glm::vec3 vPos1 = glm::vec3(20.0f, 0.0f, 0.0f);
	mModelToCamera = glm::translate(glm::mat4(1.0), vPos1);
	spDirLight.setUniform("normalMatrix", glm::transpose(glm::inverse(mModelToCamera)));
	spDirLight.setUniform("modelViewMatrix", mModelView*mModelToCamera);
	glDrawArrays(GL_TRIANGLES, 42, iTorusFaces1*3);

	CameraUpdate();
}

and my shaders look like this

 

vertex shader

#version 330

uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 normalMatrix;

layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec2 inCoord;
layout (location = 2) in vec3 inNormal;

out vec2 texCoord;

smooth out vec3 vNormal;

void main()
{
	gl_Position = projectionMatrix*modelViewMatrix*vec4(inPosition, 1.0);
	texCoord = inCoord;
	vec4 vRes = normalMatrix*vec4(inNormal, 0.0);
	vNormal = vRes.xyz;
}

 

 

 

fragment shader

#version 330

in vec2 texCoord;
smooth in vec3 vNormal;
out vec4 outputColor;

uniform sampler2D gSampler;
uniform vec4 vColor;

struct SimpleDirectionalLight
{
	vec3 vColor;
	vec3 vDirection;
	float fAmbientIntensity;
};

uniform SimpleDirectionalLight sunLight;

void main()
{
	vec4 vTexColor = texture2D(gSampler, texCoord);
	float fDiffuseIntensity = max(0.0, dot(normalize(vNormal), -sunLight.vDirection));
	outputColor = vTexColor*vColor*vec4(sunLight.vColor*(sunLight.fAmbientIntensity+fDiffuseIntensity), 1.0);
}

 

I am more concerned about box rendering incorrectly than the torus error. I render the box same way as I did when I was using texture shader, and there was no problems. Now I used the same approach and this happens.

 

What exactly causes this to happen? unsure.png



Sponsor:



Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS