ठीक है, यहाँ कुछ अन्य सवालों के जवाब देने:
बेशक यह 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();
}
}
मुझे यकीन है कि घन नक्शा करने के लिए प्रतिपादन ज्यामिति शेडर से कोई लेना देना मिल गया है वास्तव में क्या नहीं कर रहा हूँ, यह पूरी तरह से स्वतंत्र है, फिर भी, मैं कोई जवाब नहीं है लगता है। – falstro
ज्यामिति शेडर प्रत्येक इनपुट त्रिकोण के लिए 6 आउटपुट त्रिकोण बना सकता है और इसे प्रत्येक घन मानचित्र चेहरे पर रीडायरेक्ट कर सकता है (देखें "स्तरित प्रतिपादन")। एक शेडर के बिना मुझे प्रत्येक चेहरे को जोड़ना होगा और ज्यामिति को 6 बार प्रस्तुत करना होगा। –
मैं सोच रहा हूं, क्या आप उस कोड को पेस्ट कर सकते हैं जो घन बनावट के साथ फ्रेम बफर बनाता है? मुझे इस बारे में दिलचस्पी है। – shoosh