मैं एक गेम इंजन बनाने के लिए एसडीएल 2 और सी ++ 11 का उपयोग कर रहा हूं (जैसे कि एक निजी परियोजना, मज़ेदार और अभ्यास के लिए), और उन चीजों में से एक जो मैं करना चाहता हूं और ग्राफिक्स ड्राइवर ओपनजीएल के नवीनतम समर्थित संस्करण का उपयोग करता है, और संस्करण के आधार पर इंजन के ग्राफिक्स हिस्से को कैसे प्रस्तुत करता है, इस प्रकार भिन्न होता है। इस तरह मैं ओपनजीएल की नवीनतम सुविधाओं का उपयोग कर सकता हूं जहां वे प्रासंगिक और उपयोगी हैं, लेकिन पुराने हार्डवेयर का भी समर्थन करते हैं। वहाँ दो तरीकों मैं के बारे में सोच सकते हैं:एक ओपनजीएल 4.3 संदर्भ क्रैश बनाना जीएलएक्स
ओपन के नवीनतम समर्थित संस्करण का पता लगा रहा है और उस का उपयोग कर, लेकिन मुझे लगता है कि ऐसा करने के लिए किसी भी तरह से नहीं सोच सकते हैं। हां, मैंने Google की कोशिश की है।
परीक्षण और त्रुटि का उपयोग करना, जहां मैं नवीनतम संस्करण से शुरू होता हूं (4.3, लेकिन मेरा जीटीएक्स 460 केवल 4.2 तक का समर्थन करता है, भले ही मैंने ड्राइवर अपडेट किए हों), और यदि यह विफल हो जाता है (जिसे मैं एसडीएल की जांच करके पता लगाता हूं एक पूर्ण संदर्भ वापस करने के लिए), मैं संस्करण संख्या को कम करता हूं और पुनः प्रयास करता हूं।
जिस विधि का मैं उपयोग करता हूं (# 2) 4.3 संदर्भ के निर्माण पर तत्काल विफल रहता है। मुझे पता है कि मेरे ग्राफिक्स ड्राइवर अभी 4.2 का समर्थन करते हैं, लेकिन मैंने सोचा था कि जीएलएक्स को एक त्रुटि फेंकने, एक पूर्ण संदर्भ देने के लिए डिज़ाइन किया गया था, और आपके प्रोग्राम को जारी रखने दें, लेकिन इसके बजाय यह संदर्भ की असफल रचना को पीछे नहीं ला सकता । क्या मेरी धारणा है कि जीएलएक्स कैसे गलत व्यवहार करता है? संदर्भ बनाने के बिना नवीनतम समर्थित संस्करण का पता लगाने का कोई तरीका है?
क्योंकि मैं जानता हूँ कि कुछ लोगों को पूरा और कम से कम स्रोत है कि त्रुटि दर्शाता है देखना पसंद करते हैं यहाँ यह है:
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
int main() {
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
return -1;
}
SDL_Window* window = SDL_CreateWindow("SDL Window", 0, 0, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if(window == nullptr) {
return -1;
}
unsigned int major = 4;
unsigned int minor = 3;
SDL_GLContext context = nullptr;
while(context == nullptr) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
context = SDL_GL_CreateContext(window);
if(context == nullptr) {
if(minor == 0 && major > 1) {
--major;
minor = 9;
}
else if(minor > 0) {
--minor;
}
else {
SDL_DestroyWindow(window);
return -1;
}
}
}
SDL_Delay(5000);
SDL_GL_DeleteContext(context);
SDL_DestroyWindow(window);
return 0;
}
इसके अलावा, अगर मुझे लगता है कि कोड को बदलने के लिए एक 4.3 के बजाय एक 4.2 संदर्भ के साथ शुरू करने के लिए, यह ठीक काम करता है। तो त्रुटि 4.3 संदर्भ विशेष रूप से बनाने में है।
सुनिश्चित नहीं है कि यह मदद करेगा, लेकिन यह सवाल बताता है कि संदर्भ संस्करण को SDL_Init को कॉल करने से पहले सेट करना होगा: http://stackoverflow.com/questions/8110053/creating-an-opengl-3-2- 3-x-context-in-sdl-1-3 –
वॉन, वास्तव में? यह अजीब बात है, एसडीएल दस्तावेज़ों का मतलब है कि इसे एसडीएल इनिट को कॉल करने और संदर्भ बनाने से पहले सेट करना होगा। इसके अलावा, अगर मैं 4.2 से शुरू करने के लिए कोड बदलता हूं, तो यह ठीक काम करता है। शायद उल्लेख किया जाना चाहिए था कि ... – OniLink
क्या आपने @VaughnCato द्वारा प्रदान किए गए सुझाव की कोशिश की है? क्या आपने 'SDL_GL_SetAttribute' से वापसी मानों की जांच की है, दस्तावेज़ों का सुझाव है कि उन्हें सफलता के लिए 0 होना चाहिए। कोड में यह क्रैश हो रहा है? डीबगर आपको क्या बताता है? –