لماذا يقوم كود الإضاءة GLSL بتغيير نقطة الضوء بالكاميرا؟

StackOverflow https://stackoverflow.com/questions/6392167

  •  29-10-2019
  •  | 
  •  

سؤال

أحاول إنشاء تظليل ضوئي مخصص وكنت أحاول الكثير من الأشياء المختلفة مع مرور الوقت.بعض الحلول التي وجدتها تعمل بشكل أفضل والبعض الآخر أسوأ.بالنسبة لهذا السؤال، أستخدم الحل الذي نجح بشكل أفضل حتى الآن.

مشكلتي هي أنني إذا قمت بتحريك "الكاميرا"، فإن مواضع الإضاءة تبدو وكأنها تتحرك أيضًا.يحتوي هذا المحلول على حركة طفيفة جدًا ولكنها ملحوظة ويبدو أن موضع الضوء أعلى من حيث ينبغي أن يكون.

تعمل إضاءة OpenGL الافتراضية (بدون أي تظليل) بشكل جيد (مواضع الإضاءة الثابتة) ولكني بحاجة إلى التظليل من أجل تعدد الأنسجة وأخطط لاستخدام أجزاء منه لتأثيرات الإضاءة بمجرد أن يعمل.

مصدر فيرتكس:

varying vec3 vlp, vn;

void main(void)
{
    gl_Position = ftransform();

    vn = normalize(gl_NormalMatrix * -gl_Normal);
    vlp = normalize(vec3(gl_LightSource[0].position.xyz) - vec3(gl_ModelViewMatrix * -gl_Vertex));

    gl_TexCoord[0] = gl_MultiTexCoord0;
} 

مصدر القطعة:

uniform sampler2D baseTexture;
uniform sampler2D teamTexture;
uniform vec4 teamColor;

varying vec3 vlp, vn;

void main(void)
{
    vec4 newColor = texture2D(teamTexture, vec2(gl_TexCoord[0]));
    newColor = newColor * teamColor;
    float teamBlend = newColor.a;

    // mixing the textures and colorizing them. this works, I tested it w/o lighting!
    vec4 outColor = mix(texture2D(baseTexture, vec2(gl_TexCoord[0])), newColor, teamBlend);

    // apply lighting
    outColor *= max(dot(vn, vlp), 0.0);
    outColor.a = texture2D(baseTexture, vec2(gl_TexCoord[0])).a;

    gl_FragColor = outColor;
}

ما الخطأ الذي افعله؟

هل كانت مفيدة؟

المحلول

لا أستطيع التأكد من أن أيًا من هذه الأشياء هي المشكلة، لكنها قد تسبب مشكلة.

أولا، تحتاج إلى تطبيع كل قمة الخاص بك vn و vlp (راجع للشغل، حاول استخدام أسماء متغيرات وصفية أكثر. viewLightPosition هو أسهل بكثير للفهم من vlp).أعلم أنك قمت بتطبيعها في تظليل قمة الرأس، لكن استيفاء تظليل الأجزاء سيؤدي إلى إلغاء طبيعتها.

ثانيًا، هذا ليس خطأً بشكل خاص بقدر ما هو زائد عن الحاجة. vec3(gl_LightSource[0].position.xyz)."position.xyz" هو بالفعل vec3، نظرًا لأن قناع swizzle (.xyz) يحتوي على 3 مكونات فقط.لا تحتاج إلى إرساله إلى vec3 مرة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top