2010-07-27 26 views
5

मेरे पास एक ओपनजीएल एप्लीकेशन है जो एक डीएक्सएफ लोड करता है और स्क्रीन पर इसे खींचता है, प्रत्येक बार मुझे मानक की गणना करने की आवश्यकता होती है। क्या सीपीयू के बजाय जीपीयू में मानदंडों की गणना करने का कोई तरीका है? यदि हां, तो कैसे ?क्या मैं जीपीयू में मानक की गणना कर सकता हूं?

उत्तर

2

हां, यह संभव है। आप Cg में शेडर्स के बारे में जानना चाहेंगे।

Official book

+2

Normals, एक ज्यामिति शेडर में गणना की जानी चाहिए नहीं टुकड़ा। – ext

1

glEnable(GL_AUTO_NORMAL) पर एक नज़र डालें।

4

आप ज्यामिति शेडर के भीतर से "फ्लैट-छायांकित" (एक सामान्य प्रति चेहरा) मानदंडों की गणना कर सकते हैं। प्रत्येक त्रिकोण के लिए, "फ्लाई पर", क्रॉस-प्रोडक्ट्स का उपयोग करके। आप इस तरह से "चिकनी" मानक उत्पन्न नहीं कर सकते हैं, क्योंकि जीएस पड़ोसियों के बारे में जानकारी नहीं है।

यदि जाल पैरामीट्रिक (कहें, मेटाबॉल्स) है, तो सामान्य के पास कुछ पास के फ़ंक्शन मानों का नमूनाकरण करके गणना की जा सकती है। यह जीपीयू पर भी किया जा सकता है।

यदि जाल ऊंचाई या कुछ समान पर आधारित है तो आप शेडर में मानकों की गणना भी कर सकते हैं।

यदि जीपीयू सीयूडीए, ओपनसीएल या कुछ समान का समर्थन करता है, और यदि यह डेटा के मनमानी सरणी को संसाधित कर सकता है, तो आप परंपरागत टेक्निक्स का उपयोग करके जीपीयू पर मानक भी गणना कर सकते हैं।

इसके अलावा, मुझे लगता है कि 5 साल पहले (या तो) मैंने "जीपीयू पर सामान्य चिकनाई" या "जीपीयू पर सामान्य पीढ़ी" जैसे कुछ पेपर को देखा था। यह पहले पृष्ठ पर एक फ्लैट छायांकित प्रतिबिंबित बहुभुज दिल था। दुर्भाग्यवश, मैं उस पेपर का पता नहीं लगा सकता, और मुझे बिल्कुल यकीन नहीं है कि यह अस्तित्व में है (या जहां मैंने इसे देखा)। आप जीडीसी पेपर, सिगोग्राफ पेपर, अति एसडीके या एनवीडिया एसडीके में इसे ढूंढ सकते हैं (यदि यह मौजूद है)।

4

आपको शेडर्स का उपयोग करना होगा।

आप एक जीएलएसएल ज्यामिति शेडर का उपयोग कर सकते हैं। चेहरा मानक के लिए जीएलएसएल संस्करण यहां दिया गया है। वर्टिसेस मानदंडों को अधिक काम की आवश्यकता होती है क्योंकि उन्हें पड़ोसी शोर को खाते में लेना पड़ता है।

  • सुनिश्चित करें कि आपका ग्राफिक कार्ड ज्यामिति शेडर्स का समर्थन करता है! उदाहरण के लिए जीपीयू कैप्स व्यूअर का प्रयोग करें।
  • अपने ऐप में एक ज्यामिति शेडर को शामिल करने के लिए किसी भी ट्यूटोरियल को काटें और पेस्ट करें।
  • शेडर इस तरह दिखना चाहिए:
//glsl shader 

#version 120 
#extension GL_EXT_geometry_shader4 : enable 
void main(void) 
{ 
// Compute per-face normal 
    vec4 d1 = gl_PositionIn[1] - gl_PositionIn[0]; 
    vec4 d2 = gl_PositionIn[2] - gl_PositionIn[0]; 
    gl_Normal = cross(d1,d2); 

// Emit all input vertices 
    for(i=0; i< gl_VerticesIn; i++){ 
     gl_Position = gl_PositionIn[i]; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 
संबंधित मुद्दे