मैं अपने Voxel इंजन में पॉइंट लाइट्स को लागू कर रहा हूं, और मैं प्रकाश स्रोत पर प्रकाश स्रोत के पास 100% से 0% तक प्रकाश का एक अच्छा प्रवाह प्राप्त करने के लिए वास्तव में संघर्ष कर रहा हूं।
मेरे पास फंक्शन के लिए 5 तर्क हैं:
- हल्के रंग (Vec3)
- प्रकाश की तीव्रता (प्रकाश से दूरी उस दूरी तक जहां फ़ॉलऑफ़ 100% है)
- प्रकाश से अंश की दूरी
- सामान्य से लेकर प्रकाश तक का कोण
- प्रकाश की स्थिति
क्या कोई मुझे सही दिशा में खंडित रंग की गणना के लिए एक समारोह बनाने के लिए धक्का दे सकता है?
मेरे एक प्रयोग की छवि:
संपादित करें (बाइट द्वारा अनुरोध किया गया वर्तमान कोड) ध्यान दें कि यह मेरी तरफ से सिर्फ कुछ प्रयोग कोड है। मुझे एक वेबसाइट से फ्लोट एट मिला, और यह प्रकार काम करता है, लेकिन बिल्कुल सही। :
void main()
{
// Light color
vec3 torchColor = vec3(1.0f, 1.0f, 1.0f);
float lightAdd = 0.0f;
for (int i=0; i<5; i++) {
vec3 pos = lights[i];
if (pos.x == 0.0f) continue;
float dist = distance(vertex_pos, pos);
if (dist < 9) {
float att=1.0/(1.0+0.1*dist+0.01*dist*dist);
vec3 surf2light = normalize(pos - vertex_pos);
vec3 norm = normalize(normal);
float dcont=max(0.0,dot(norm,surf2light));
lightAdd += att*(dcont+0.4);
}
}
vec3 textureColor = texture2D(texture, texture_coordinate).rgb;
vec3 torch_output = lightAdd * torchColor;
vec3 final_color = ((0.1+torch_output) * textureColor);
gl_FragColor = vec4(final_color, 1.0f);
}
if (dist < 9)
? वैकल्पिक रूप से आप att
एक ऐसे फंक्शन की गणना कर सकते हैं जो 1 है जब दूरी 0 है और 0 जब दूरी 9 है। उदाहरण के लिएmix(1.0, 0.0, dist / 9.0)