OpenGl 3+ Normal Matrix und Licht

Hi,
ich hatte vor einiger Zeit hier schon einmal ein Thema zu einem einfachen Licht und der Normal Matrix erstellt, nachdem ich jetzt längere Zeit mich nicht aktiv mit OpenGl beschäftigt hatte, wollte ich die Methode von damals etwas verändern.
Falls ich es richtig verstanden habe, sollte es möglich sein die Normal Matrix direkt aus der Modelviewmatrix zu berechnen ohne den Umweg über eine temporäre Matrix, die alle Matrix Operationen enthält, zu gehen.
Wenn ich allerdings die Normal-Matrix nun als die transponierte der Inversen Matrix der Modelview-Matrix definiere, bewegt sich das Licht mit der Kamera. Ich wollte dieses Problem dardurch lösen, dass ich die Modelview Matrix vorher in eine 3x3 Matrixe umwandele, wobei der Translationteil wegfällt, jedoch hat dies nicht funktioniert.

Hier ist eine KSKB dazu : Link

Ich würde mich freuen wenn ihr mir helfen könntet.

Schonmal danke fürs durchlesen ;).

Mfg,
~Oneric

Moin,

ich hab nur kurz drüber gesehen, aber:

Die „Kamera“ ist immer an der gleichen Stelle. Die Illusion, dass die Kamera sich bewegen würde, entsteht, weil alle anderen Objekte bewegt werden. Gehst Du in Deinem Beispiel nach links, bewegt sich in Wirklichkeit Dein Objekt nach rechts. Soll sich das Licht statisch zum Objekt verhalten, musst Du das Licht entsprechend bewegen. In Deinem Beispiel vermutlich etwas wie -normalMatrix*sunLight.vDirection.

Ansonsten läuft Dein Beispiel bei mir aber leider auch nicht vernünftig. Das Objekt wirkt einfach falsch, auch ohne Licht.

Viele Grüße
Fancy

Hi,
vielen Dank für deine Antwort.

Wenn ich die Matrix und den Vector im Fragment Shader miteinander multipliziere, funktioniert es wunderbar :).

MfG,
~Oneric

*** Edit ***

[QUOTE=Oneric]Hi,
Wenn ich die Matrix und den Vector im Fragment Shader miteinander multipliziere, funktioniert es wunderbar :).
[/QUOTE]

Theoretisch sollte es doch auch möglich sein den Vector vor dem Uploaden in den Shader mit der Matrix zu multiplizieren, wenn ich jedoch versuche dies zu relaisieren, habe ich jedoch das gleiche Problem wie vorher.
Was mache ich falsch ?

Hier mein Code zum multiplizieren

public static Vector3f mul(Matrix3f m3, Vector3f v3)
	{
		// 1. die spalte 2. die zeile
		return new Vector3f(
				
				m3.m00 * v3.x + m3.m01 * v3.y + m3.m02 * v3.z,
				m3.m10 * v3.x + m3.m11 * v3.y + m3.m12 * v3.z,
				m3.m20 * v3.x + m3.m21 * v3.y + m3.m22 * v3.z
				);
	}

//Im Programm
shSun.setUniform("sunLight.vDirection", MatrixHelper.mul(m_Normal, vSunPos));

Hier der Shader wenn man den Vector erst im Shader multipliziert

Vertex:


#version 330

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

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

out vec2 texCoord;
out mat3 m_Normal;

smooth out vec3 vNormal;

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

Fragment


#version 330

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

uniform sampler2D gSampler;

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

uniform SimpleDirectionalLight sunLight;

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

Also die Lösung war eigentlich recht simpel, ich habe in der Multiplikationsmethode schlicht die Matrix-Spalte mit der Matrix-Zeile vertauscht, nun funktioniert es wunderbar :slight_smile:

MfG,
~Oneric