2012-06-13 18 views
7

में अजीब स्क्वायर लाइटिंग कलाकृतियों मेरे पास एक प्रोग्राम है जो एक ऊंचाईमैप उत्पन्न करता है और फिर इसे ओपनजीएल के साथ जाल के रूप में प्रदर्शित करता है। जब मैं प्रकाश जोड़ने की कोशिश करता हूं, तो यह जाल को ढंकने वाले अजीब स्क्वायर आकृतियों के साथ समाप्त होता है। वे दूसरों के मुकाबले कुछ क्षेत्रों में अधिक ध्यान देने योग्य हैं, लेकिन हमेशा वहां रहते हैं।ओपनजीएल

मैं एक ट्रैक्टर जाल का उपयोग कर रहा था, लेकिन त्रिकोण जाल पर स्विच करने के बाद कुछ भी नहीं बदला। मैंने वर्टेक्स मानदंडों की गणना करने के लिए कम से कम तीन अलग-अलग तरीकों का उपयोग किया है, सभी एक ही प्रभाव के साथ। मैं शेडर्स के साथ मैन्युअल रूप से प्रकाश कर रहा था, लेकिन बिल्टिन ओपनजीएल लाइटिंग सिस्टम का उपयोग करते समय कुछ भी नहीं बदला।

int i; 
for (i = 0; i < NINDEX; i += 3) { 
    vec v[3]; 
    v[0] = verts[faces[i + 0]]; 
    v[1] = verts[faces[i + 1]]; 
    v[2] = verts[faces[i + 2]]; 

    vec v1 = vec_sub(v[1], v[0]); 
    vec v2 = vec_sub(v[2], v[0]); 

    vec n = vec_norm(vec_cross(v2, v1)); 

    norms[faces[i + 0]] = vec_add(norms[faces[i + 0]], n); 
    norms[faces[i + 1]] = vec_add(norms[faces[i + 1]], n); 
    norms[faces[i + 2]] = vec_add(norms[faces[i + 2]], n); 
} 

for (i = 0; i < NVERTS; i++) { 
    norms[i] = vec_norm(norms[i]); 
} 

हालांकि यह है कि केवल कोड मैं का उपयोग किया है नहीं है, इसलिए मैं यह है कि शक:

मेरे नवीनतम सामान्य पैदा कोड (का सामना कर रहा verts में सूचकांक की एक सरणी, शिखर सारणी है) समस्या का कारण है।

मैं के साथ जाल आकर्षित:

और मैं वर्तमान में किसी भी shaders नहीं उपयोग कर रहा हूँ।

इसका कारण क्या हो सकता है?

संपादित करें: स्क्रीनशॉट का एक अधिक व्यापक सेट:

पिछले एक के लिए, शेडर कोड

है

वर्टेक्स:

varying vec3 lightvec, normal; 

void main() { 
    vec3 lightpos = vec3(0, 0, 100); 
    vec3 v = vec3(gl_ModelViewMatrix * gl_Vertex); 
    normal = gl_NormalMatrix * gl_Normal; 

    lightvec = normalize(lightpos - v); 

    gl_Position = ftransform(); 
} 

टुकड़ा:

varying vec3 lightvec, normal; 

void main(void) { 
    float l = dot(lightvec, normal); 
    gl_FragColor = vec4(l, l, l, 1); 
} 
+0

क्या आप एक ही दृश्य के दो स्क्रीनशॉट पोस्ट कर सकते हैं, एक वायरफ्रेम के साथ और बिना किसी के? –

+0

क्या 'मानक' शून्य-प्रारंभिक है? आप इसे पहले शून्य करने के बिना अपने वैक्टर को जमा कर रहे हैं, हालांकि यदि यह प्रोग्राम में कहीं और शून्य हो गया है जो समस्या नहीं होनी चाहिए। – genpfault

+0

क्या आप शेडर में सामान्य विशेषताओं के लिए चिकनी इंटरपोलेशन का उपयोग कर रहे हैं? शायद थोड़ा सा 'फ्लैट' पर स्विच करने से समस्या को स्थानीयकृत करने में मदद मिल सकती है। इसके अलावा, ओपनजीएल लाइटिंग मेरे लिए बहुत छोटी होती है - मैं आमतौर पर कोड लिखने के बारे में अधिक निश्चित हूं। –

उत्तर

1

मैं गैर शेडर संस्करणों के लिए एक निश्चित जवाब नहीं है, लेकिन मैं जोड़ने के लिए है कि आप में पिक्सेल प्रकाश प्रति कर रहे हैं चाहता था आपका टुकड़ा शेडर, आपको शायद टुकड़े के शेडर के अंदर सामान्य और lightvec सामान्यीकृत करना चाहिए।

यदि आप ऐसा नहीं करते हैं तो वे इकाई की लंबाई नहीं होते हैं (दो सामान्यीकृत वैक्टरों के बीच एक रैखिक इंटरपोलेशन आवश्यक नहीं है)। यह शेडर संस्करण में दिखाई देने वाली कुछ कलाकृतियों को समझा सकता है, क्योंकि डॉट उत्पाद की परिमाण ऊर्ध्वाधर से दूरी के कार्य के रूप में भिन्न होती है, जो आप देख रहे हैं।

संपादित करें: एक और विचार, क्या आप गैर-शेडर संस्करण को प्रस्तुत करते समय जाल के किसी भी गैर-वर्दी स्केलिंग (विभिन्न x, y, z) कर रहे हैं? यदि आप इसे स्केल करते हैं, तो आपको उलटा पैमाने कारक द्वारा मानक को संशोधित करने की आवश्यकता है, या glEnable(GL_NORMALIZE) सेट करें।यहाँ और अधिक के लिए देखें: http://www.lighthouse3d.com/tutorials/glsl-tutorial/normalization-issues/

2

आप या तो टुकड़ा शेडर में सामान्य को सामान्य बनाने, इसलिए तरह की जरूरत है:

varying vec3 lightvec, normal; 

void main(void) { 
    vec3 normalNormed = normalize(normal); 
    float l = dot(lightvec, normalNormed); 
    gl_FragColor = vec4(l, l, l, 1); 
} 

यह हालांकि महंगा हो सकता है। दिशात्मक रोशनी के साथ इस मामले में भी काम करेगा, वर्टेक्स प्रकाश का उपयोग करना है। तो, शिखर शेडर

varying float lightItensity; 

void main() { 
    vec3 lightpos = vec3(0, 0, 100); 
    vec3 v = vec3(gl_ModelViewMatrix * gl_Vertex); 
    normal = gl_NormalMatrix * gl_Normal; 

    lightvec = normalize(lightpos - v); 

    lightItensity = dot(normal, lightvec); 

    gl_Position = ftransform(); 
} 

में प्रकाश मूल्य की गणना और

varying float light; 

void main(void) { 
    float l = light; 
    gl_FragColor = vec4(l, l, l, 1); 
} 

मुझे आशा है कि यह यह ठीक करता है टुकड़ा शेडर में इसका इस्तेमाल करते हैं, मुझे पता है कि अगर ऐसा नहीं होता हैं।

संपादित करें: उसके बारे में यहां छोटे चित्र बताते हैं कि क्या सबसे अधिक संभावना है हो रहा

enter image description here

EDIT2:

हैं कि, मदद नहीं करता है और अधिक त्रिकोण जोड़ें। अपने heightmap के मानों को अलग करें और बीच में कुछ कोष्ठक जोड़ें।

वैकल्पिक रूप से, अपनी टेस्सेलेशन योजना को बदलने का प्रयास करें। उदाहरण के लिए समकक्ष त्रिकोणों का जाल इस तरह कलाकृतियों को कम महत्वपूर्ण बना सकता है।

enter image description here

आप अपने heightmap पर कुछ प्रक्षेप करना होगा।

अन्यथा मुझे कोई जानकारी नहीं है .. शुभकामनाएं!

+0

धन्यवाद, लेकिन दुर्भाग्य से मैंने पहले ही ऐसा कुछ करने का प्रयास किया है। मुझे आश्चर्य है कि समस्या मेरे ग्राफिक्स कार्ड (1.5 वर्षीय इंटेल एकीकृत चिप) में है या नहीं। – sigill

+0

मुझे अत्यधिक संदेह है। शेडर कोड को उसी ग्राफिक्स कार्ड पर उसी तरह निष्पादित करना चाहिए जो इसका समर्थन करता है। – Hannesh