मैं OpenGL के लिए SFML के साथ बनावट कैसे लोड करूं?


9

मैं NeHe की बनावट मैपिंग ट्यूटोरियल देख रहा हूं । यह सिर्फ एक बनावट लोड करने के लिए अत्यधिक जटिल लग रहा है।

क्या एसएफएमएल में एक बनावट को लोड करने और फिर ओपन जीएल में इसका उपयोग करने का एक तरीका है? मैं अपनी विंडोिंग के लिए SFML का उपयोग करता हूं।

जवाबों:


16

ओपनजीएल में आपका स्वागत है, जहाँ तेज़ चीज़ें मुफ्त में मिलती हैं और आसान चीज़ें मुश्किल से बनती हैं।

यदि आपको लगता है कि नमूना लंबा और जटिल था, "बस एक बनावट लोड करने के लिए", तो आपने अभी तक कुछ भी नहीं देखा है। प्रतीक्षा करें जब तक आपको डीडीएस बनावट लोड नहीं करना है, एचडीआर बनावट की प्रक्रिया करें, क्यूबैप्स का समर्थन करें, एक बनावट को प्रस्तुत करें, आदि।

OpenGL में एक बनावट लोड हो रहा है दो घटक होते हैं:

  • अपने छवि प्रारूप से डेटा प्राप्त करना। आप एक फ़ाइल से एक बनावट लोड कर सकते हैं या इसे प्रक्रियात्मक रूप से उत्पन्न कर सकते हैं। इससे कोई फर्क नहीं पड़ता, जब तक आप रंग जानकारी का एक अच्छा सरणी के साथ समाप्त होते हैं।

  • वीडियो को वीडियोकार्ड पर डालना। डेटा को सिस्टम रैम से वीडियो रैम तक जाने की आवश्यकता है।

पहला भाग आसान होना चाहिए, क्योंकि एसएफएमएल एक मानक छवि लोडर के साथ आता है।

sf::Image img_data;
if (!img_data.LoadFromFile("images/avatar.png"))
{
    LOG_ERROR("Could not load '%s'.", "images/avatar.png");
    return false;
}

अगला, हमें एक OpenGL बनावट ऑब्जेक्ट जेनरेट करना होगा।

GLuint texture_handle;
glGenTextures(1, &texture_handle);

एक बनावट को बांधने के लिए कई विकल्प हैं। तीन मुख्य प्रकार हैं: 1 डी, 2 डी और 3 डी और आपके पास क्यूबैप्स (+ X, -X, + Y, -Y, + Z, -Z) के लिए समर्थन है। हालांकि, 99% मामलों में, आप एक 2 डी बनावट चाहते हैं।

glBindTexture(GL_TEXTURE_2D, texture_handle);

अब हम दिलचस्प भाग में आते हैं। आइए हमारे डेटा को वीडियो कार्ड पर अपलोड करें।

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    img_data.GetWidth(), img_data.GetHeight(),
    0,
    GL_RGBA, GL_UNSIGNED_BYTE, img_data.GetPixelsPtr()
);

अंत में, हम कई बनावट पैरामीटर सेट कर सकते हैं। इन सवालों के जवाब जैसे: क्या होगा अगर हम एक बनावट के समन्वय का उपयोग करें जो सीमा के बाहर हो (0.0, 1.0)? क्या हम चारों ओर लपेटते हैं ( GL_REPEAT) या हम कुछ नहीं करते ( GL_CLAMP)? उनका उपयोग उस वीडियोकोडर को समझाने के लिए भी किया जा सकता है जिसे हम अपने बनावट पर रैखिक प्रक्षेप का उपयोग करना चाहते हैं।

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

और अब आप का उपयोग करके अपनी बनावट को बांधने में सक्षम होना चाहिए glBindTextureऔर इसका उपयोग बनावट वाले मेश को खींचने के लिए करना चाहिए ।


एमएमएम, मैंने ऐसा करने की कोशिश की और मुझे सब कुछ एक सफेद घन मिला: pastebin.com/nVQFAMRJ
डारेस्टियम

glEnable(GL_TEXTURE2D);इनिट फ़ंक्शन में डालने का प्रयास करें ।
नाइट ६६ kn

बहुत बढ़िया, काम करता है! धन्यवाद! BTW, वह कार्य क्या करता है? टेक्सचरिंग सक्षम करें?
डेरेस्टियम

हां, यह 2 डी बनावट ऑब्जेक्ट को चालू करता है, इसलिए यह बनावट डेटा प्राप्त कर सकता है। आपको इसे केवल एक बार आरंभीकरण पर सक्षम करना होगा, लेकिन कोड को किसी नए प्रोजेक्ट में कॉपी करते समय यह अक्सर भूल जाता है। खुद को शामिल किया। ;)
नाइट ६६६

बहुत अच्छी व्याख्या। आप ट्यूटोरियल लिख सकते हैं!
दानीजार

2

SFML 2.0+ बनावट को लोड करना और भी आसान बनाता है;

sf::Texture texLid;
std::string image2="images/top.jpg";
if (!texLid.loadFromFile(image2))
{
    std::cout << "Could not load" << image2;
    char c;
    std::cin>>c;
    return false;
}


glEnable(GL_TEXTURE_2D);//tell OpenGL to use textures when drawing

sf::Texture::bind(&texLid);//select this texture for OpenGL rendering
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.