2015-01-30 11 views
6

OpenGL'nin Qt üzerinde nasıl çalıştığı konusunda daha önce bir soru yayınladım, ancak şimdi OpenGL'nin kullanım için en son işlevlerini kullanmak istiyorum. Qt'den önce glew kullanıyordum; ama Qt, glew'nin QtOpenGL başlık dosyasıyla çakıştığını söylüyor. QGLWidget ve QGLFunctions'a baktım, ama açıkçası, OpenGL'nin işlevlerine erişmek için gerçekten ne yapmam gerektiği konusunda kafam karıştı.En son OpenGL işlevlerini Qt sınıflarında kullanma 5.4

Şimdi Qt 5.4'ü Qt Creator 3.3.0 kullanarak aldım ve yeni QOpenGLWidget'i kullanıyorum; bununla birlikte, nasıl kullanılması gerektiği konusunda rehberlik eksikliği beni çok az fırlatır: Qt belgeleri oradadır ve yardımcı olur, ancak programın diğer yerlerinde kullanmak yerine sadece nasıl örneklendirileceğini gösterir. Bu QOpenGLWidget'in QGLWidget'e benzer şekilde çalıştığını anlıyorum. Qt ayrılmam gereken ayrıntılar; ancak OpenGL işlevlerini kullanmak istediği sınıf içinde bir OpenGL bağlamı oluşturmuyorum; Bu, QOpenGLWidget öğesinden devraldığı 'glWidget' sınıfında olur.

Örneğin, OpenGL kodunu kullanan benim sınıfların birinden bu alıntıyı atın:

void Mesh::init() 
{ 
    pNumIndices = pIndices.size(); 

    glGenVertexArrays(1, &pVAO); 
    glGenBuffers(1, &pVertexBuffer); 
    glGenBuffers(1, &pIndexBuffer); 
    glBindVertexArray(pVAO); 

    glBindBuffer(GL_ARRAY_BUFFER, pVertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, pVertices.size() * sizeof(Vertex), 
       &pVertices[0], GL_STATIC_DRAW); 

    // etc.. 
} 

Mesh şey devralan olmayan bir sınıftır. Aslında, sadece OpenGL işlevlerinin bildirimlerini alabilmesi için glew kullandı; Geçerli olup olmadıklarını bilmemize gerek yoktu, çünkü bu glew'nin işi. Sonra mainApp sınıfında, glew'yi örnekliyor olacağım. Ayrıca, Glew'inkine benzer bir şekilde çalışan bir QOpenGLFunctions sınıfının da olduğunu anlıyorum, ancak tüm bu GL sınıflarıyla birlikte, ne kullanacağını bilmek şaşırtıcı derecede kafa karıştırıcı. Dahası glGenVertexArrays (..) aramayı denedim ama QOpenGLBuffer, QOpenGLFunctions veya QOpenGLWidget içinde bulunamadı; ve şimdiye kadar bildiğim kadarıyla, OpenGL 4.5'ten bu yana yine de speklerin bir parçası; ama grafik sürücülerim OpenGL 4.5 kullanmıyor, bu yüzden OpenGL 4.3 kullanıyorum. QG'nin, OpenGL işlevlerini arama konusundaki kendi yaklaşımını benimsemesi için golew'den vazgeçmeye razı olduğumu söylemek yeterli.

Çeşitli sınıfların OpenGL işlevlerini kullandığı bir programda, glew kullanmadan bunları aramak için Qt'yi nasıl kullanabilirim? Mesh, OpenGL'yi başlatmayan ancak yalnızca işlevlerini kullanan sınıflardan biridir.

İnsanların bildiği gibi, bir süredir Qt kullanıyorum (yeterli değil!) Ve Qt'den hoşlanıyorlar; ama geliştirmeye devam etmek için OpenGL ile birlikte Qt'yi nasıl kullanabileceğimi bilmem gerekiyor. Orada çoğu öğreticiler hala 5.4 öncesi malzeme kullanıyorlar.

struct sLGLAPI 
{ 
    sLGLAPI() { memset(this, 0, sizeof(*this)); }; 
    PFNGLACTIVETEXTUREPROC  glActiveTexture; 
    PFNGLATTACHSHADERPROC  glAttachShader; 
    PFNGLBEGINQUERYPROC   glBeginQuery; 
    PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; 
    ... 

OpenGL paylaşılan kitaplıktan -ed işaretçiler dlsym ile doldurun:

+1

'glGenVertexArrays' köşe dizisi nesneler içindir, senin main.cpp dosyasına bu kodu eklemeniz gerekir Aramanız gereken sınıf adı nedir? Bu doğru, [QOpenGLVertexArrayObject'] (http://doc.qt.io/qt-5/qopenglvertexarrayobject.html)! – peppe

+0

Ben şahsen OpenGL şeylerini merkezi olarak depolayan Q şeylerini beğenmiyorum. Bu tür şeyleri kendi sınıflarımla yapmayı tercih ederim. – Poriferous

cevap

4

Qt 5.4, bu şekilde, sürüm belirli OpenGL Fonksiyonları ile başlıklar vardır:

#include <QOpenGLFunctions_3_3_Core> 

Veya ne olursa olsun sürümü kullanmak istiyorum.Sonra bir yerde QOpenGLWidget :: initializeGL gibi geçerli OpenGL bağlamıyla() oluşturmak ve initialize bir QOpenGLFunctions nesnesi: En beraberlik kodunda sonra

QOpenGLFunctions_3_3_Core *fun = new QOpenGLFunctions_3_3_Core; 
fun->initializeOpenGLFunctions(); 

Ve sadece o nesneden OpenGL işlevlerini kullanın:

fun->glSomething(1,2,3) 
+3

Başka bir seçenek * böyle bir sınıftan * miras almadır, böylece basitçe "glSomething" yazabilirsiniz ve işe yarayacaktır. – peppe

+0

Tamam, ve QOpenGLWidget olmayan ancak OpenGL 4.3 işlevlerini kullanan başka bir sınıfım varsa, ne yapmalıyım? – Poriferous

+0

Bir QOpenGLFunctions_3_3_Core nesnesi oluşturun veya ondan türetin. Bununla ilgili hiçbir şey QOpenGLWidget'e herhangi bir şekilde bağlı değildir. Başladığınızda sadece geçerli bir geçerli OpenGL Bağlamına ihtiyacınız var. – wrosecrans

1

OpenGL ile basit bir yaklaşım fonksiyonu işaretçileri içeren bir yapı oluşturmak için de

API->glActiveTexture = (PFNGLACTIVETEXTUREPROC)GetGLProc("glActiveTexture"); 
API->glAttachShader = (PFNGLATTACHSHADERPROC)GetGLProc("glAttachShader"); 
API->glBeginQuery = (PFNGLBEGINQUERYPROC)GetGLProc("glBeginQuery"); 
API->glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)GetGLProc("glBindAttribLocation"); 

Ve erişim OpenGL senin sadece bu yapı üzerinden kod. Eğer tam OpenGL API gizlemek ve hatta gerektiğinde parametreleri giriş yapmak için veya OpenGL ve OpenGL ES arasında geçiş yapmak, örneğin, saplama işlevlerini kullanmak mümkün olacak

API->glShaderSource(Shader, 1, &Code, nullptr); 
API->glCompileShader(Shader); 

Bu arada: Örneğin.

+0

Çözümünüz uygun; ama dlsym sadece Linux ve benzeri sistemlerde kullanılabilir. Linux'u da kullanıyorum; ama benim de Windows altında çalışmak için kodumu almalıyım. Qt'nin böyle bir görevi üstlenmenin çok yönlü bir yolu yok mu? – Poriferous

+1

@Poriferous GetProcAddress, dlsym – BlamKiwi

+0

'a en yakın olan şeydir. Bu, peşinde olduğum çözüm kadar ilginç değil; Qt ile daha tutarlı bir şeye ihtiyacım var. – Poriferous

1
#include <QOpenGLFunctions_3_3_Core> 

class Mesh : public QOpenGLFunctions_3_3_Core 
{ 
public: 
    Mesh();//initializeOpenGLFunctions() 
    ~Mesh();  

    void func();//glxxx in it. when using it ,you need an opengl context. 
       //for example, use makeCurrent() in QOpenGLWidget subclass. 
}; 
1

QOpenGLFunctions_X_X_ * kullanımı bu sorunu çözmeyecektir! QOpenGLFunctions_X_X_ * 'ı kullanmadan önce openGL içeriğinin sürümünü ayarlamanız gerekir. Qt varsayılan sürümü (I 1.X'de düşünüyorum) kullanan bu yüzden bu kadar

 QSurfaceFormat format; 
//  format.setDepthBufferSize(24); 
    // format.setStencilBufferSize(8); 

     format.setMajorVersion(3); //whatever version 
     format.setMinorVersion(3); // 
     format.setProfile(QSurfaceFormat::CoreProfile); 
     QSurfaceFormat::setDefaultFormat(format); 

Alkış, Nai

İlgili konular