Mesa v18.0.5 kullanmak, ancak yalnızca OpenGL v3.0 sürümünü almak


0

OpenGL kullanarak C / C ++ uygulamaları geliştirmeye çalışıyorum. Maalesef, OpenGL 3.0’dan sonraki hiçbir işlevselliğe erişemedim. Mesa versiyonum 18.0.5, Linux Mint 18 64-bit, 4.18.1 Çekirdek ve Intel Integrated Graphics'im var.

Terminal çıkışı:

 ~ $ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Broadwell-U 
Integrated Graphics (rev 09)
 ~ $ glxinfo | grep OpenGL
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 5500 (Broadwell 
GT2) 
OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.0.5
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 18.0.5
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 18.0.5
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 
3.10
OpenGL ES profile extensions:

Donanımımın OpenGL 4.4'e kadar desteklediğinden eminim, çünkü bu makine MS daha önce bir güncellemeye zorlamadan / zorlamadan önce bir Windows 10 makinesiydi ve bu süre zarfında OpenGL 4.4 ve GLSL 440 kullanarak geliştirdim.

Ayrıca, Java'da OpenGL 4.4 programlarını, birlikte paketlenmiş tüm gerekli OpenGL kitaplıklarına sahip olan ve sistem sürümüne hiç de bağlı olmayan JOGL aracılığıyla çalıştırabilirim.

Peki, temel olarak, Mesa neden çekirdekli sürüm 4.5 olduğunu söylüyor, ancak daha sonra 3.0 sürüm dizesini veriyor? (Aynı sürüm glGetString (GL_VERSION) döner.) Ve OpenGL 4.4'e nasıl yeniden erişebilirim? (4.5 değilse!)


1
Neyi glxinfo | grep "Max core"çıktı? MESA_GL_VERSION_OVERRIDEOrada listelenen maksimum değere kadar herhangi bir desteklenen sürüme ayarlayabilmeniz gerekir .
Stephen Kitt

@Stephen Kitt Çıktıları Max core profile version: 4.5. MESA_GL_VERSION_OVERRIDEBireysel uygulamaları geçersiz kılma ile çalıştırmak için kullanıldığını gördüm . Bu her seferinde bunu kullanmam gerektiği anlamına mı geliyor? Bunu varsayılan olarak ayarlamanın bir yolu var mı?
TK

Yanıtlar:


0

Anladığım kadarıyla, önemli değer “OpenGL version string” değil “max core core version”. Bağlamınızı oluştururken bir çekirdek profili belirtmezseniz veya benzeri bir şey yazarsanız,

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, 0);

Mesa, size bir OpenGL 3.0 bağlamı verecektir (profiller OpenGL 3.0'da tanıtıldığından beri bu tür bir anlam ifade eder, bu yüzden uygulamaların onlar hakkında bilgi sahibi olmaması beklenebilecek son sürümdür). Daha yeni bir OpenGL sürümü istiyorsanız, ilgili profili belirtmeniz gerekir:

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

veya

glutInitContextProfile(GLUT_CORE_PROFILE);

kullanarak sürümüyle birlikte glutInitContext().

Bir OpenGL sürümünü bu şekilde uygulamanın güçlü bir kısıtlama oluşturduğuna dikkat edin; Ne yaptığını bildiğini sanıyorum ;-). Bazı geliştiriciler, makul bir sürümü (örneğin, OpenGL 3.2) kadar düşük bir hedefi hedeflemeye çalışırlar ve daha sonra ihtiyaç duydukları uzantıları isterler - popüler uzantılar, ilgili OpenGL sürümü tam olarak desteklenmeden önce bir süre kullanılabilir olma eğiliminde olduğundan, genellikle daha iyi çalışır. sürücüler.

MESA_GL_VERSION_OVERRIDEsadece bir hata ayıklama veya Mesa geliştirme aracıdır; rapor edilen OpenGL sürümünü zorla geçersiz kılar ve Mesa'nın gerçekten desteklemediği değerlere ayarlanabilir!


Null döndürmek için glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);nedenleri kullanma glfwCreateWindow(640, 480, "Hello World", NULL, NULL);. (Uyumluluk profilinin ayarlanması gibi) glfwOpenWindowHint()glfw (2) için doğru, ancak glfwWindowHint()glfw3 olarak değiştirildi . Şu anda MESA_GL_VERSION_OVERRIDEIDE'mde lansman seçeneği olarak kullanıyorum ve mükemmel bir şekilde çalışıyor ve ihtiyacım olan işlevselliği kullanmama izin veriyor. Bununla ilgili tek sorun, sizin de belirttiğiniz gibi, bunun için değil. Yardımın için çok teşekkürler. Sanırım işe yarayacak pencere ipuçlarını almaya çalışacağım.
TK,

Hala glfwWindowHint()sistemim üzerinde çalışamadım, ancak gerçekten "Doğru" cevap gibi görünüyor. Sanırım şimdilik kesmeyle bağlantıda kalacağım. Yardım için teşekkürler.
TK
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.