मैं NeHe की बनावट मैपिंग ट्यूटोरियल देख रहा हूं । यह सिर्फ एक बनावट लोड करने के लिए अत्यधिक जटिल लग रहा है।
क्या एसएफएमएल में एक बनावट को लोड करने और फिर ओपन जीएल में इसका उपयोग करने का एक तरीका है? मैं अपनी विंडोिंग के लिए SFML का उपयोग करता हूं।
मैं NeHe की बनावट मैपिंग ट्यूटोरियल देख रहा हूं । यह सिर्फ एक बनावट लोड करने के लिए अत्यधिक जटिल लग रहा है।
क्या एसएफएमएल में एक बनावट को लोड करने और फिर ओपन जीएल में इसका उपयोग करने का एक तरीका है? मैं अपनी विंडोिंग के लिए SFML का उपयोग करता हूं।
जवाबों:
ओपनजीएल में आपका स्वागत है, जहाँ तेज़ चीज़ें मुफ्त में मिलती हैं और आसान चीज़ें मुश्किल से बनती हैं।
यदि आपको लगता है कि नमूना लंबा और जटिल था, "बस एक बनावट लोड करने के लिए", तो आपने अभी तक कुछ भी नहीं देखा है। प्रतीक्षा करें जब तक आपको डीडीएस बनावट लोड नहीं करना है, एचडीआर बनावट की प्रक्रिया करें, क्यूबैप्स का समर्थन करें, एक बनावट को प्रस्तुत करें, आदि।
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
और इसका उपयोग बनावट वाले मेश को खींचने के लिए करना चाहिए ।
glEnable(GL_TEXTURE2D);
इनिट फ़ंक्शन में डालने का प्रयास करें ।
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