私は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);
}
`
光源と惑星が300ユニット離れている場合、あなたの惑星はあなたの光の1/300〜0,003の影響を受けます。これは意図されていますか? – Shiro
これはガンマ補正と組み合わせた減衰に関するチュートリアルの一部でした。私はそれを取り除きましたが、違いはありませんでした。 –
私はソーラーシステムを実装するプログラムを持っています。そこにはインスタンスはありませんが、稲妻(影もあります)があります。あなたは見て比較することができます、多分あなたは何が間違っていることに気づきます。コードはここにあります:https://github.com/aromanro/SolarSystem –