2016-06-30 15 views
0

Ich bin ein wenig Anfänger bei OpenGL und ich habe die Beleuchtung einer Szene mit instanziierten Asteroiden implementiert, die einen Planeten umkreisen. Aus irgendeinem Grund scheint die einzige Ausgabe, die ich bekomme, die Umgebungsbeleuchtung für die Szene zu sein. Ich kann nicht diffus oder spiegelnd arbeiten.OpenGL-Fragment-Shader, der die Szene nicht beleuchtet

Hier ist ein Bild der Szene, wie sie ist (sehr schwer zu sehen ...) ambient only

Das Fragment-Shader-Code ist unten. FragPos, Normal und TexCoords sind wie erwartet. texture_diffuse1 ist die Planet/Asteroid-Textur, abhängig vom verwendeten Shader. LightPos kann bewegt werden, es wird durch den kleineren Planeten im Bild dargestellt (also direkt über dem zentralen Planeten) und viewPos ist die Kameraposition.

Weitere Informationen benötigt bitte lassen Sie mich wissen, aber dort ist der Rest des Codes wirklich geradlinig (Vertex Shader wirklich Standard, Assimp geladen Modelle in der Szene gezeichnet, Asteroiden instanziert 200.000 Mal).

Dank Jon

Fragment Shader:

`

#version 330 core 
out vec4 fragColor; 

in VS_OUT{ 
    vec3 FragPos; 
    vec3 Normal; 
    vec2 TexCoords; 
} fs_in; 

uniform sampler2D texture_diffuse1; 
uniform vec3 lightPos; 
uniform vec3 viewPos; 

void main() 
{ 
    vec3 color = texture(texture_diffuse1, fs_in.TexCoords).rgb; 

    //Ambient 
    vec3 ambient = 0.05f * color; 

    //Diffuse 
    vec3 lightDir = normalize(lightPos - fs_in.FragPos); 
    vec3 normal = normalize(fs_in.Normal); 
    float diff = max(dot(lightDir, normal), 0.0); 
    vec3 diffuse = diff * color; 

    //Specular 

    vec3 viewDir = normalize(viewPos - fs_in.FragPos); 

    float spec = 0.0f; 
    vec3 halfwayDir = normalize(lightDir + viewDir); 
    spec = pow(max(dot(normal, halfwayDir), 0.0), 32.0f); 

    vec3 specular = vec3(0.3f) * spec * color; 

    float distance = length(lightPos - fs_in.FragPos); 
    float attenuation = 1.0f/distance; 

    //fragColor = vec4(ambient + (diffuse + specular), 1.0f); 
    fragColor = vec4(pow(ambient + attenuation * (diffuse + specular),vec3(1.0f/2.2f)), 1.0f); 
} 

`

+0

Wenn Ihre Lichtquelle und Ihr Planet 300 Einheiten entfernt sind, wird Ihr Planet nur von 1/300 ~ 0,003 Ihres Lichts betroffen sein. Ist das beabsichtigt? – Shiro

+0

Es war Teil eines Tutorials zur Dämpfung gemischt mit Gammakorrektur. Ich habe das entfernt und es hat keinen Unterschied gemacht. –

+0

Ich habe ein Programm zur Implementierung eines Solarsystems. Keine Instanziierung dort, aber es gibt Blitze (auch Schatten). Sie können schauen und vergleichen, vielleicht bemerken Sie, was falsch ist. Der Code ist hier: https://github.com/aromanro/SolarSystem –

Antwort

0

Es scheint, dass die Richtung des Blitzes nicht in Ordnung war. Statt lightPos - fs_in.FragPos wurde fs_in.FragPos - lightPos benötigt. Ich werde hier der Link zu meinem Code lassen, die geholfen haben, machen es sichtbar, vielleicht wird es anderen helfen, auch: https://github.com/aromanro/SolarSystem

bearbeiten

JonCain: Es hat sich auch für die Normals die Matrix aus wurde nicht ordnungsgemäß angewendet, bevor es vom Vertex Shader weitergegeben wurde.