2016-06-30 6 views
0

私はOpenGLの初心者ですが、インスタンス化された小惑星が惑星を回っているシーンに照明を実装しました。何らかの理由で、私が得ている唯一の出力は、シーンのアンビエントライティングのようです。私は拡散したり鏡面になったりすることはできません。そのままOpenGLフラグメントシェーダがシーンを照らしていない

はここambient only

フラグメントシェーダコードは以下の通りです(参照することは非常に難しい...)シーンの画像です。 FragPos、Normal、TexCoordsは期待通りです。 texture_diffuse1は、使用されるシェーダに応じた惑星/小惑星テクスチャです。 LightPosは動かすことができます。それは画像内のより小さな惑星(中心惑星の真上)で表され、viewPosはカメラの位置です。

これ以上の情報は私に教えてください。しかし、コードの残りの部分は実際にはまっすぐです(頂点シェーダは本当に標準で、シーンに描画されたassimpがロードされたモデル、小惑星は20万回インスタンスされました)。

おかげ ジョン

フラグメントシェーダ:

`

#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

光源と惑星が300ユニット離れている場合、あなたの惑星はあなたの光の1/300〜0,003の影響を受けます。これは意図されていますか? – Shiro

+0

これはガンマ補正と組み合わせた減衰に関するチュートリアルの一部でした。私はそれを取り除きましたが、違いはありませんでした。 –

+0

私はソーラーシステムを実装するプログラムを持っています。そこにはインスタンスはありませんが、稲妻(影もあります)があります。あなたは見て比較することができます、多分あなたは何が間違っていることに気づきます。コードはここにあります:https://github.com/aromanro/SolarSystem –

答えて

0

稲妻の方向が間違っていたようです。 lightPos - fs_in.FragPosの代わりにfs_in.FragPos - lightPosが必要でした。 https://github.com/aromanro/SolarSystem

編集

JonCain:それはまた、法線のための行列を判明私はここであまりにも助けた私のコードへのリンク、それをより見やすくするために、多分それは他人を助けるをもらおうVertex Shaderから渡される前に適切に適用されていませんでした。

関連する問題