আমি কীভাবে ওপেনগিএলের জন্য এসএফএমএল দিয়ে টেক্সচার লোড করব?


9

আমি নেহের টেক্সচার ম্যাপিং টিউটোরিয়ালটি দেখছি । এটি কেবল একটি টেক্সচার লোড করার জন্য অতিরিক্ত জটিল দেখায়।

এসএফএমএলে কোনও টেক্সচার লোড করার এবং তারপর ওপেন জিএল-তে এটি ব্যবহার করার কোনও উপায় আছে কি? আমি আমার উইন্ডোটিংয়ের জন্য এসএফএমএল ব্যবহার করি।

উত্তর:


16

ওপেনজিএলে স্বাগতম, যেখানে দ্রুত জিনিসগুলি নিখরচায় আসে এবং সহজ জিনিসগুলি শক্ত করে তোলে।

যদি আপনি মনে করেন যে নমুনাটি দীর্ঘ এবং জটিল, "কেবল একটি টেক্সচার লোড করার জন্য", তবে আপনি এখনও কিছুই দেখেন নি। আপনার ডিডিএস টেক্সচার লোড না করা, এইচডিআর টেক্সচার প্রসেস করা, কিউব্যাপ সমর্থন করা, কোনও টেক্সচারে রেন্ডার করা ইত্যাদি অপেক্ষা করুন

ওপেনজিএলে একটি টেক্সচার লোড করাতে দুটি উপাদান থাকে:

  • আপনার চিত্রের ফর্ম্যাট থেকে ডেটা পাওয়া। আপনি কোনও ফাইল থেকে একটি জমিন লোড করতে পারেন বা প্রক্রিয়াগতভাবে এটি উত্পন্ন করতে পারেন। যতক্ষণ আপনি রঙের তথ্যের একটি দুর্দান্ত অ্যারেটি শেষ করেন ততক্ষণ তা বিবেচ্য নয়।

  • ভিডিও কার্ডে ডেটা লাগানো। ডেটা সিস্টেম র‌্যাম থেকে ভিডিও র‌্যামে যেতে হবে।

প্রথম অংশটি সহজ হওয়া উচিত, কারণ এসএফএমএল স্ট্যান্ডার্ড ইমেজ লোডার সহ আসে।

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

এর পরে, আমাদের একটি ওপেনজিএল টেক্সচার অবজেক্ট তৈরি করতে হবে।

GLuint texture_handle;
glGenTextures(1, &texture_handle);

একটি জমিন বাঁধাই করার জন্য অনেকগুলি পছন্দ রয়েছে। তিনটি প্রধান প্রকার রয়েছে: 1 ডি, 2 ডি এবং 3 ডি এবং আপনার কিউব্যাপস (+ এক্স,-এক্স, + ওয়াই, -ওয়াই, + জেড,-জেড) এর জন্য সমর্থন রয়েছে। তবে, 99% ক্ষেত্রে, আপনি 2D টেক্সচার চাইবেন।

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টেক্সচার্ড মেসগুলি আঁকার জন্য আপনার টেক্সচারটি আবদ্ধ করতে এবং এটি ব্যবহার করতে সক্ষম হবেন ।


মিমি, আমি এটি করার চেষ্টা করেছি এবং যা পেয়েছি তা একটি সাদা ঘনক্ষেত্র: পেস্টবিন.
com

glEnable(GL_TEXTURE2D);Init ফাংশনটি রাখার চেষ্টা করুন ।
নাইট 666

দুর্দান্ত, কাজ! ধন্যবাদ! বিটিডব্লিউ, এই ফাংশনটি কী করে? টেক্সচার সক্ষম করবেন?
Daretium

হ্যাঁ, এটি 2D টেক্সচার অবজেক্টটিকে সক্রিয় করে, তাই এটি টেক্সচার ডেটা গ্রহণ করতে পারে। আপনাকে কেবল একবার সূচনাতে সক্ষম করতে হবে তবে কোনও নতুন প্রকল্পে কোড অনুলিপি করার সময় এটি প্রায়শই ভুলে যায়। আমার নিজের অন্তর্ভুক্ত। ;)
নাইট 666

খুব সুন্দর ব্যাখ্যা। আপনি টিউটোরিয়াল লিখতে পারে!
দানিজার

2

এসএফএমএল ২.০+ একটি টেক্সচার লোড করা আরও সহজ করে তোলে;

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.