Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

21

05.07.2011, 22:08

Ich habe nochmal alle variablen durchgetestet.
Er soltle 8 Light Strukturen erzeugen.

Von der ersten Struktur bekomme ich bei "enable" ne 1
Bei Ambient bekomme ich dann eine 0 und ab dann nur noch -1.
Und bei allen weiter strukturen bekomme ich -1 bei allen werten.

So frage ich das ganze ab.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int i = 0; i < Lights.Length; i++)
{
    int position = Gl.glGetUniformLocation(shader, "Lights["+i+"].enabled");
    int positiona =Gl.glGetUniformLocation(shader, "Lights["+i+"].ambient");
    int positionb = Gl.glGetUniformLocation(shader, "Lights["+i+"].diffuse");
    int positionc = Gl.glGetUniformLocation(shader, "Lights["+i+"].specular");
    int positiond = Gl.glGetUniformLocation(shader, "Lights["+i+"].position");
     int positione = Gl.glGetUniformLocation(shader, "Lights["+i+"].halfVector");
    int positionf = Gl.glGetUniformLocation(shader, "Lights["+i+"].spotDirection");
    int positiong = Gl.glGetUniformLocation(shader, "Lights["+i+"].spotExponent");
     int positionh = Gl.glGetUniformLocation(shader, "Lights["+i+"].spotCutoff");
    int positioni = Gl.glGetUniformLocation(shader, "Lights["+i+"].spotCosCutoff");
    int positionj = Gl.glGetUniformLocation(shader, "Lights["+i+"].spotOuterConeCutOff");
    int positionk = Gl.glGetUniformLocation(shader, "Lights["+i+"].constantAttenuation");
    int positionl = Gl.glGetUniformLocation(shader, "Lights["+i+"].linearAttenuation");
    int positionm = Gl.glGetUniformLocation(shader, "Lights["+i+"].quadraticAttenuation");
}

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

22

06.07.2011, 10:48

Ich glaube ich habe des Lösungs Rätsel.

Ich habe gelesen das in GLSL alle Variablen die nicht verwendet werden wegoptimiert werden.
Das würde erklären warum ich eine -1 bei manchen Variablen bekomme.
Ich werde das heute Abend nochmal nachprüfen.

Wofür steht eigentlich die 0?
Ist das auch eine Gültige Adresse?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

06.07.2011, 11:18

Ich habe gelesen das in GLSL alle Variablen die nicht verwendet werden wegoptimiert werden.

Jap

Wofür steht eigentlich die 0?
Ist das auch eine Gültige Adresse?

Jap

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

24

06.07.2011, 11:21

Na da hät ich ja lange probieren können XD

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

25

07.07.2011, 12:58

So habs heute morgen mit meinem frischem System nochmal gecheckt und es hat tatsächlich daran gelegen das die Variablen keinen einfluss auf das Ergebniss hatten.

Das dumme war das eigentlich nie ein Problem mit der Position bestanden hat.
Ich hatte versucht ne Ambiente Farbe auf die Textur zu rechnen was aber nicht geklappt hat.
Bei glUniformfv() hatte ich bei count ne 4 stehen weil ich dachte das dass für die anzahl der Elemente der Farbe stand.

Da es nicht geklappt hatte, hab ich geguckt ob die Position stimmt. Ich wusste jedoch nicht das 0 auch eine gültige Position :rolleyes:.
Und so ging ich davon aus das er die Variable nicht gefunden hat.

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

26

08.07.2011, 21:21

Erneut habe ich mal wieder schwierigkeiten :D

Ich habe in den versucht meinem Bumpmapschader für mehrere Lichter umzubiegen. Bin aber gescheitert.

Habe das ganze nun noch mal sauber von vorn angefangen und es stellt sich raus das die Werte die ich in meine Strukturen geladen habe nicht immer die Selben sind die OpenGL unter seinen Integrierten Uniformvariablen sind.

Angefangen bei gl_Lights.position;

Momentan versuche ich lediglich die Diffuse Farbe ins Spiel zu bringen.
Verwende ich die vorgegebene Variable ist alles Palleti.
Verwende ich die eigen Struktur nicht.

Beide werden aber mit den selben daten Gefüttert.
Ich habe im hintergrund noch die Feste Pipeline die ebenfalls mit der selben lichtposition gefüttert wurde.

Warum sind die werte dann aber unterschiedlich?

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

27

08.07.2011, 21:26

Noch ein Hinweis:

Wenn ich meine Struktur verwende wirk es so alls ob die Überfläche stark reflektieren.
Dieser effekt variiert je nach richtung.

Ich vermute mal das die Lichtposition im Falschen Space ist.
Aber in welchen muss sie? und wie stell ich das an? die Position wird ohne multiplikation einer Matrix übergeben.

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

28

08.07.2011, 21:31

Immer wenn man dot mal braucht is er nicht da ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

29

08.07.2011, 22:47

Ich vermute mal das die Lichtposition im Falschen Space ist.
Aber in welchen muss sie? und wie stell ich das an? die Position wird ohne multiplikation einer Matrix übergeben.

Das hängt davon ab. Die FFP macht die Beleuchtung im Viewspace. Aber du kannst dir das im Prinzip aussuchen, solange alle Vektoren im selben Space liegen wirds funktionieren...

botlin

Treue Seele

  • »botlin« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Berlin

Beruf: Fachinformatiker für Anwendungsentwicklung, Student Internationale Medieninformatik

  • Private Nachricht senden

30

08.07.2011, 23:36

Ich Pack dir einfach mal die Shader rein...
vieleicht siehst du ja was da verkehrt läuft.

Wie gesagt die Lichtposition kommt direkt aus dem Object Space.


Vertex Shader

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*Vertexshader*/
attribute vec4 InVertex;
attribute vec4 InNormal;
attribute vec4 InTexCoord;
attribute vec4 InTangent;
varying mat3 tangentSpace;
varying vec3 vertex;

void main(void)
{   
        
    vec3 tangent=vec3(InTangent);               
    vec3 binormal =cross(vec3(InNormal),tangent);
        
    tangentSpace= mat3(tangent.x,binormal.x,InNormal.x,
                       tangent.y,binormal.y,InNormal.y,
                       tangent.z,binormal.z,InNormal.z);
        
    gl_Position = gl_ModelViewProjectionMatrix * (vec4(InVertex));
    
    gl_TexCoord[0]=InTexCoord;
    gl_TexCoord[1]=InTexCoord;
    vertex=vec3(gl_ModelViewMatrix*InVertex);       
}


Fragment Shader

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*Fragmentshader*/
/* Lichtstruktur */

struct light
{
bool enabled;
vec4 ambient;
vec4 diffuse;
vec4 specular;
vec4 position;
vec3 spotDirection;
float spotCutoff;
float sharpness;
float constantAttenuation;
float linearAttenuation;
float quadraticAttenuation;
};

uniform light Lights[gl_MaxLights];
uniform sampler2D texSampler1;
uniform sampler2D texSampler2;
varying mat3 tangentSpace;
varying vec4 vertex;

void main(void)
{
    vec3 Normal=vec3(texture2D(texSampler2,vec2(gl_TexCoord[0])))-0.5;
    Normal*=tangentSpace;
    Normal =normalize(gl_NormalMatrix * Normal);
    vec3 lightvec;
    vec4 FinalColor;
    vec4 DiffuseColor;
    
    for (int i=0;i<gl_MaxLights;i++)
    {
            if(Lights[i].enabled)
            {   
                
                lightvec=Lights[i].position.xyz;
                lightvec=normalize(lightvec - vec3(vertex));
                
                
                
                DiffuseColor=Lights[i].diffuse;
                DiffuseColor*=max(dot(Normal,lightvec),0.0);
                FinalColor+=DiffuseColor;
            }
    }
    gl_FragColor=FinalColor;
}

Werbeanzeige