# LWJGL: Licht und GL_LINES funktioniert nicht



## Friedhelm (13. Jan 2013)

Ich versuche in einer 3D Welt für den Boden ein Gitternetz mit 3D-Linien zu zeichnen inkl. Licht (siehe Code).

Aber das Licht (ist vor den Objekten im 3D-Raum platziert) funktioniert bei den Linien irgendwie nicht richtig. Habe das Gefühl, dass die Linien nicht richtig beleuchtet werden.

Hinzu kommt, wenn ich (// * Rotieren *, siehe letzter Code) für das Gitternetz verwende, bleibt das Licht einwandfrei auf den 3D Objekten, aber auf dem Gitternetz rotiert das Licht nach hinten, obwohl es ja vorne steht(siehe Bild).


Auf ein 3D-Objekt fällt das Licht korrekt, aber die Linien interessiert das nicht.

Blöd ist auch, dass die Linien nicht rot sind, sondern gelb.


Hat jemand ein Tip oder ein kurzes Linien-Beispiel?



```
FloatBuffer redDiffuse = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 1.0f, 1.0f, 1.0f, 1.0f }).flip();
FloatBuffer redPos 	= (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 5.0f, 10.0f, 1.0f }).flip();

// GL_DIFFUSE, GL_AMBIENT, GL_SPECULAR

GL11.glLight(GL11.GL_LIGHT0,GL11.GL_DIFFUSE, redDiffuse);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_POSITION, redPos);
```



```
gl.glPushMatrix();	
		
GL11.glDisable(GL11.GL_TEXTURE_2D); 		
GL11.glEnable(GL11.GL_COLOR_MATERIAL); 
GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE);	
		
		
FloatBuffer mat_solid 	= (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 0.75f, 0.0f, 0.0f, 1.0f }).flip();
GL11.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, mat_solid);
			
GL11.glLineWidth(1.0f); 

GL11.glBegin(GL11.GL_LINES); 		
GL11.glVertex3f( ax, ay, az); 
GL11.glVertex3f( bx, by, bz); 
GL11.glEnd(); 

gl.glPopMatrix();
```



```
GL11.glDisable(GL11.GL_TEXTURE_2D); 		
GL11.glEnable(GL11.GL_COLOR_MATERIAL); 
GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE);	
		
		
FloatBuffer mat_solid 	= (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] { 0.75f, 0.0f, 0.0f, 1.0f }).flip();
GL11.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, mat_solid);
			
GL11.glLineWidth(1.0f); 

// * Rotieren *
rotGitter += .001;
gl.glRotatef(0.0f,1f,0f,0f);
gl.glRotatef(rotGitter,0f,1f,0f);
gl.glRotatef(0.0f,0f,0f,1f); 

GL11.glBegin(GL11.GL_LINES); 		
GL11.glVertex3f( ax, ay, az); 
GL11.glVertex3f( bx, by, bz); 
GL11.glEnd(); 

gl.glPopMatrix();
```


----------



## Friedhelm (13. Jan 2013)

Kann es sein das es bei einfachen Linien an den fehlenden Normalen scheitert und die Linie gar nicht richtig beleuchtet werden können?

Ok, eigentlich brauche ich die Linien gar nicht zu beleuchten, aber mich interessiert das Problem einfach, und natürlich die Lösung


----------



## Marco13 (13. Jan 2013)

Friedhelm hat gesagt.:


> Kann es sein das es bei einfachen Linien an den fehlenden Normalen scheitert und die Linie gar nicht richtig beleuchtet werden können?



Ohne den weiteren Code nachvollzogen zu haben: Auch Linien brauchen für die Beleuchtungsberechnung Normalen für ihre Vertices. Dürfte hier recht einfach sein: Die sind wohl alle (0,0,1)....
 (Aber beim Überfliegen: Du zeichest doch hoffentlich ALLE Linien zwischen dem glBegin und dem glEnd...?)


----------



## Friedhelm (13. Jan 2013)

Marco13 hat gesagt.:


> Ohne den weiteren Code nachvollzogen zu haben: Auch Linien brauchen für die Beleuchtungsberechnung Normalen für ihre Vertices. Dürfte hier recht einfach sein: Die sind wohl alle (0,0,1)....



Danke, müsste das dann so aussehen?:


```
for(int x=-size;x<=size;x+=4) {

	GL11.glBegin(GL11.GL_LINES); 		
	GL11.glNormal3f(0.0f, 0.0f, 1.0f);
	GL11.glVertex3f( x, 0, -size); 
	GL11.glVertex3f( x, 0, size); 
	GL11.glEnd();
}

for(int z=-size;z<=size;z+=4) {

	GL11.glBegin(GL11.GL_LINES); 		
	GL11.glNormal3f(0.0f, 0.0f, 1.0f);
	GL11.glVertex3f( -size, 0, z); 
	GL11.glVertex3f( size, 0, z); 
	GL11.glEnd();
}
```



Marco13 hat gesagt.:


> (Aber beim Überfliegen: Du zeichest doch hoffentlich ALLE Linien zwischen dem glBegin und dem glEnd...?)



Ja.


Was ist mit dem Lichtcode? Das scheint auf die Linien keinen besonderen Eindruck zu machen.

Wie würdest Du eine Linie im 3D Raum zeichnen und das Licht dazu einstellen?


----------



## Guest2 (14. Jan 2013)

Moin,

ich habe nie versucht GL_LINES zu beleuchten, insofern bin ich mir noch nicht mal sicher, ob da mit der Fixed Function Pipeline überhaupt vernünftige Ergebnisse zu erwarten wären. Hinzu kommt, dass so wie die Szene oben wohl angeordnet ist, eine per Vertex Beleuchtung imho ohnehin keine sinnvollen Ergebnisse bringen kann.

Wenn man die Linien unbedingt beleuchten möchte, könnte man vielleicht versuchen die Fläche über Quads aufzubauen und mit glPolygonMode nur die Kanten zu zeichnen, eventuell könnte die Beleuchtung dann einigermaßen funktionieren.

Eine andere Alternative wäre das über Shader zu regeln. Dann könnte man nicht nur per Fragment beleuchten, sondern gleichzeitig auch noch "die" Normale bestimmen. 




Friedhelm hat gesagt.:


> Ja.



Vermutlich meint Marco das ehr so:


```
GL11.glBegin(GL11.GL_LINES);
for(int x=-size;x<=size;x+=4) {
	GL11.glVertex3f( x, 0, -size); 
	GL11.glVertex3f( x, 0, size); 
}
GL11.glEnd();
```

Das wäre schon besser, allerdings gehört in eine ernsthafte Anwendung überhaupt kein glBegin.

Viele Grüße,
Fancy


----------



## Marco13 (14. Jan 2013)

Guest2 hat gesagt.:


> ich habe nie versucht GL_LINES zu beleuchten, insofern bin ich mir noch nicht mal sicher, ob da mit der Fixed Function Pipeline überhaupt vernünftige Ergebnisse zu erwarten wären.



Hmja, bestenfalls das, was man mit Gouraud Shading eben so bekommt. 

@Topic: Hat das Licht in seiner aktuellen Form denn Einfluß auf die NICHT-Lines? Ggf. mal ein Einzelnes Dreieck in die Ebene rendern, zum Vergleich..


----------



## Friedhelm (14. Jan 2013)

Das dachte ich mir schon, wollte es auch nur mal probieren. Danke.


----------

