2009-01-20 28 views
11

ARB_geometry_shader4 के अनुसार प्रस्तुत करना एक ज्यामेट्री शेडर और फ्रेमबफर ऑब्जेक्ट से जुड़े घन मानचित्र के साथ घन मानचित्र के 6 चेहरे पर एक दृश्य प्रस्तुत करना संभव है। मैं इस तरह से एक छाया मानचित्र बनाना चाहता हूँ।घन मानचित्र

  1. मैं केवल GL_DEPTH_ATTACHMENT_EXT करने के लिए आंतरिक प्रकार के रूप में GL_DEPTH_COMPONENT के साथ एक बनावट संलग्न कर सकते हैं: लेकिन वहाँ एक संघर्ष है कि मैं का समाधान नहीं कर हो रहा है।
  2. एक गहराई बनावट केवल 1 डी या 2 डी हो सकती है।
  3. यदि मैं एक घन मानचित्र संलग्न करना चाहता हूं, तो अन्य सभी संलग्न बनावट क्यूब मानचित्र भी होनी चाहिए।

तो ऐसा लगता है कि जब मैं घन मानचित्र में प्रस्तुत करना चाहता हूं तो मैं किसी भी गहराई परीक्षण का उपयोग नहीं कर सकता। या मैं यहाँ क्या याद कर रहा हूँ?

संपादित करें: यह नए एनवीडिया ड्राइवर (180.48) समर्थन गहराई घन मानचित्रों जैसा दिखता है।

+0

मुझे यकीन है कि घन नक्शा करने के लिए प्रतिपादन ज्यामिति शेडर से कोई लेना देना मिल गया है वास्तव में क्या नहीं कर रहा हूँ, यह पूरी तरह से स्वतंत्र है, फिर भी, मैं कोई जवाब नहीं है लगता है। – falstro

+1

ज्यामिति शेडर प्रत्येक इनपुट त्रिकोण के लिए 6 आउटपुट त्रिकोण बना सकता है और इसे प्रत्येक घन मानचित्र चेहरे पर रीडायरेक्ट कर सकता है (देखें "स्तरित प्रतिपादन")। एक शेडर के बिना मुझे प्रत्येक चेहरे को जोड़ना होगा और ज्यामिति को 6 बार प्रस्तुत करना होगा। –

+0

मैं सोच रहा हूं, क्या आप उस कोड को पेस्ट कर सकते हैं जो घन बनावट के साथ फ्रेम बफर बनाता है? मुझे इस बारे में दिलचस्पी है। – shoosh

उत्तर

12

ठीक है, यहाँ कुछ अन्य सवालों के जवाब देने:

बेशक यह 6 FBOs, प्रत्येक चेहरे के लिए एक का उपयोग करना संभव है। या एक एफबीओ का उपयोग करने के लिए और प्रत्येक चेहरे को आकर्षित करने से पहले संलग्न करें। दोनों मामलों में क्यूब नक्शा चेहरे को किसी अन्य 2 डी बनावट की तरह माना जाएगा और आप इसे सामान्य 2 डी बनावट या रेंडरबफर के साथ उपयोग कर सकते हैं। और संभवतः सभी संभावित तरीकों में कोई अंतर नहीं है (यदि हार्डवेयर उनका समर्थन करता है)।

हालांकि, एक कदम में सब कुछ खींचना भी संभव है और जैसा कि मैं उत्सुक था कि यह कैसे किया जाता है मैंने कुछ शोध किया।

(डी में लिखा) एक घन नक्शा एक भी लगाव बिंदु मैं इस कोड का इस्तेमाल किया से जुड़े सभी चेहरों के साथ एक FBO बनाने के लिए:

// depth cube map 
glGenTextures(1, &tDepthCubeMap); 
glBindTexture(GL_TEXTURE_CUBE_MAP, tDepthCubeMap); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 
for (uint face = 0; face < 6; face++) { 
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_DEPTH_COMPONENT24, 
     width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, null); 
} 

// color cube map 
glGenTextures(1, &tColorCubeMap); 
glBindTexture(GL_TEXTURE_CUBE_MAP, tColorCubeMap); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 
for (uint face = 0; face < 6; face++) { 
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA, 
     width, height, 0, GL_RGBA, GL_FLOAT, null); 
} 

// framebuffer object 
glGenFramebuffersEXT(1, &fbo); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, tDepthCubeMap, 0); 
glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, tColorCubeMap, 0); 

glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); 

if (!isValidFBO()) { 
    glDeleteFramebuffersEXT(1, &fbo); 
    fbo = 0; 
} 
  • आप केवल एक गहराई नक्शा करना चाहते हैं आप glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT) को बदलना होगा; से glDrawBuffer (GL_NONE); यह मान्य पहले
  • MIN और MAG फिल्टर कुछ वैध करने के लिए सेट किया जाना चाहिए (डिफ़ॉल्ट होगा GL_NEAREST_MIPMAP_LINEAR)
  • चौड़ाई और सभी बनावट की ऊंचाई एक ही

करने के लिए किया जाना चाहिए (और यह करने के लिए ड्राइंग से पहले) एक घन मानचित्र के चेहरों को प्रस्तुत करें जो आपको एक ज्यामिति शेडर की आवश्यकता है। निम्नलिखित शेडर कुछ घूर्णन याद करते हैं लेकिन यह स्पष्ट होना चाहिए कि यह क्या करता है। gl_Layer का उपयोग आदिम को सही चेहरे (0 = + एक्स, 1 = -एक्स, ...) को निर्देशित करने के लिए किया जाता है।

#version 120 
#extension GL_EXT_geometry_shader4 : enable 

void main(void) { 
    int i, layer; 
    for (layer = 0; layer < 6; layer++) { 
     gl_Layer = layer; 
     for (i = 0; i < 3; i++) { 
      gl_Position = gl_PositionIn[i]; 
      EmitVertex(); 
     } 
     EndPrimitive(); 
    } 
} 
+0

क्या आप जानते हैं कि कौन सा एक्सटेंशन GlTexImage2D को GL_TEXTURE_CUBE_MAP_POSITIVE_X और GL_DEPTH_COMPONENT24 के साथ कॉल करना संभव बनाता है? GL_EXT_depth_texture स्पष्ट रूप से उसको अस्वीकार करता है। मुझे यह जानने की ज़रूरत है कि जीएल एक्सटेंशन क्या मैं यह जान सकता हूं कि मैं इस सुविधा का उपयोग कर सकता हूं या नहीं। मैंने मानक एक्सटेंशन रजिस्ट्री में कोई नहीं देखा। धन्यवाद। – gman

+0

यह मेरी मूल समस्या थी। ऐसी कोई जगह नहीं प्रतीत होती है जो विशेष रूप से उल्लेख करती है कि इसकी अनुमति है (हालांकि यह बदल सकता है, मैंने फिर से जांच नहीं की है)। आप शायद ARB_geometry_shader4 की जांच कर सकते हैं और फिर देख सकते हैं कि एफबीओ सेट अप त्रुटियों को उत्पन्न नहीं करता है। –

+4

मैंने कोर ओपनग्ल 3.3 के साथ काम करने की कोशिश की, लेकिन असफल रहा। घन मानचित्र से पढ़ने पर मुझे जो कुछ मिलता है वह शोर है। यदि आप एक कामकाजी उदाहरण प्रदान कर सकते हैं तो यह बहुत अच्छा होगा। –

संबंधित मुद्दे