मैं यह जानने की कोशिश कर रहा हूं कि मेरे दृश्य को क्यूब मैप में कैसे रेंडर किया जाए। मैं इस पर थोड़ा अटक गया हूं और लगा कि मैं आप लोगों से कुछ मदद मांगूंगा। मैं OpenGL के लिए नया हूं और यह पहली बार है जब मैं FBO का उपयोग कर रहा हूं।
वर्तमान में मेरे पास एक क्यूबैप bmp फ़ाइल का उपयोग करने का एक कार्यशील उदाहरण है, और टुकड़ा shader में samplerCube नमूना प्रकार GL_TEXTURE1 से जुड़ा हुआ है। मैं shader कोड बिल्कुल नहीं बदल रहा हूँ। मैं सिर्फ इस तथ्य को बदल रहा हूं कि मैं उस फ़ंक्शन को कॉल नहीं कर रहा हूं जो क्यूबमैप बीएमपी फ़ाइल को लोड कर रहा था और क्यूबमैप को प्रस्तुत करने के लिए नीचे दिए गए कोड का उपयोग करने की कोशिश कर रहा था।
आप नीचे देख सकते हैं कि मैं भी फिर से GL_TEXTURE1 की बनावट संलग्न कर रहा हूं। ऐसा तब है जब मैंने वर्दी सेट की है:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
यह के माध्यम से मेरे टुकड़े shader में यह उपयोग कर सकते हैं uniform samplerCube Cubemap
।
मैं नीचे दिए गए फ़ंक्शन को पसंद कर रहा हूं:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
अब, मैं नीचे दिए गए ड्रा लूप में महसूस करता हूं कि मैं + x, -x, + y, -y, + z, -z अक्ष को देखने के लिए दृश्य दिशा नहीं बदल रहा हूं। मैं वास्तव में सिर्फ लागू करने से पहले कुछ काम कर देखना चाहता था। मुझे लगा कि मुझे कम से कम अपनी वस्तु पर कुछ देखना चाहिए जिस तरह से कोड है।
मुझे कुछ दिखाई नहीं दे रहा है, बस सीधे काले। मैंने अपना बैकग्राउंड सफ़ेद कर लिया है फिर भी वस्तु काली है। मैंने लाइटिंग हटा दी है, और सिर्फ क्यूबैप बनावट और अभी भी काले रंग का नमूना लेने के लिए रंग कर रहा हूं।
मुझे लगता है कि समस्या मेरी बनावट सेट करते समय प्रारूप प्रकार हो सकती है जो GL_RGB8, GL_RGBA है, लेकिन मैंने भी कोशिश की है:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
मैंने सोचा था कि यह मानक होगा क्योंकि हम एक फ्रेमबफ़र से जुड़ी बनावट को प्रस्तुत कर रहे हैं, लेकिन मैंने अलग-अलग उदाहरणों को देखा है जो विभिन्न एनम मूल्यों का उपयोग करते हैं।
मैंने हर ड्रॉ कॉल में क्यूब मैप टेक्सचर को बाँधने की कोशिश की है जो मैं क्यूब मैप का उपयोग करना चाहता हूँ:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
इसके अलावा, मैं FBO के लिए एक गहराई बफ़र नहीं बना रहा हूँ जिसे मैंने ज्यादातर उदाहरणों में देखा है, क्योंकि मैं केवल अपने क्यूब मैप के लिए रंगीन बफ़र चाहता हूँ। मैंने वास्तव में एक को यह देखने के लिए जोड़ा कि क्या यह समस्या थी और अभी भी वही परिणाम मिले हैं। मैं कोशिश कर रहा था कि जब मैं कोशिश कर सकता था।
कोई भी मदद जो मुझे सही दिशा में इंगित कर सके, की सराहना की जाएगी।
GLuint renderToCubeMap(int size, GLenum InternalFormat, GLenum Format, GLenum Type)
{
// color cube map
GLuint textureObject;
int face;
GLenum status;
//glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE1);
glGenTextures(1, &textureObject);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureObject);
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 (face = 0; face < 6; face++) {
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, InternalFormat, size, size, 0, Format, Type, NULL);
}
// framebuffer object
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textureObject, 0);
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
printf("%d\"\n", status);
printf("%d\n", GL_FRAMEBUFFER_COMPLETE);
glViewport(0,0,size, size);
for (face = 1; face < 6; face++) {
drawSpheres();
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, textureObject, 0);
}
//Bind 0, which means render to back buffer, as a result, fb is unbound
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return textureObject;
}
drawSpheres
फ़ंक्शन वास्तव में कुछ दिखाई देता है? क्या फ़ंक्शन वास्तव में कुछ आकर्षित करता है? क्या होता है यदि आपdrawSpheres
केवल फ़्रेमबफ़र को बदलने के लिए बदलते हैं ?