2014-02-08 22 views
0

我的程序使用OpenGL創建並繪製了一個粒子系統。 我已經完全使用glBegin()和glEnd(),但我注意到這是過時的,不應該使用。所以我開始用glDrawArrays()重寫它;OpenGL - 快速雪碧繪圖 - 需要一些指導

我有什麼看起來是這樣的:

typedef QVector< Particle* > PARTICLES; 
#define PARTICLE_SIZE 20.0f 

void GLWidget::initializeGL() 
{ 
    //>> TEST 
    QGLFormat glFormat(QGL::SampleBuffers); 
    glFormat.setSwapInterval(1); // vsync 
    //>> /TEST 
    QImage textureSnow = QGLWidget::convertToGLFormat(imgSnow); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    glGenTextures(3, m_texture); 

    //Snow Particles 
    glBindTexture(GL_TEXTURE_2D, m_texture[1]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
      textureSnow.width(), textureSnow.height(), 
      0, GL_RGBA, GL_UNSIGNED_BYTE, textureSnow.bits()); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glFinish(); 
    m_renderTimer->start(0); 
} 

void GLWidget::paintGL() 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glClear(GL_COLOR_BUFFER_BIT); 
    glBindTexture(GL_TEXTURE_2D, m_texture[1]); 
    glEnable(GL_TEXTURE_2D); 

    glLoadIdentity(); 

    PARTICLES particles = m_particleSystem->getParticles(); 
    for(int i = 0; i < m_particleSystem->getParticleCount(); i++) 
    { 
     // Get specific variables for the Particle 
     float x = particles[i]->getX(); 
     float y = particles[i]->getY(); 
     float scale = particles[i]->getScale(); 
     float correctionValue = (PARTICLE_SIZE*scale/2); 

     const float verts[] = { 
      x -correctionValue, y -correctionValue, 
      x +PARTICLE_SIZE -correctionValue, y -correctionValue, 
      x +PARTICLE_SIZE -correctionValue, y + PARTICLE_SIZE -correctionValue, 
      x -correctionValue, y +PARTICLE_SIZE -correctionValue 
     }; 

     // Since I don't use more than one sprite for this Particle at the moment 
     const float texVerts[] = { 
      0.0f, 0.0f, 
      1.0f, 0.0f, 
      1.0f, 1.0f, 
      0.0f, 1.0f 
     }; 

     glVertexPointer(2, GL_FLOAT, 0, verts); 
     glTexCoordPointer(2, GL_FLOAT, 0, texVerts); 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    } 
} 
glBindTexture(GL_TEXTURE_2D, 0); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 

這樣,它不顯示任何內容(黑屏)。 我無法弄清楚我需要做什麼。

我其實是想知道:

我錯過了什麼?或換句話說: 如何使用精靈來繪製大量始終處於運動狀態的最新OpenGl粒子?

+0

您必須先將頂點數據提交給GPU,然後才能通過頂點緩衝區對象或頂點數組對象渲染頂點數據,然後使用着色器渲染頂點。 [本教程在教授現代opengl方面做得很好](http://open.gl/drawing) – rcapote

+0

我將會看看本教程,感謝您的回覆。 – Dunkelbunt27

回答

0

你想使用哪種OpenGL版本?

OGL 2.0ES,2.1,3.0及更高版本存在細微的差異,但您基本上需要着色器並減少數據的更改/上傳,對於粒子系統,可以在着色器側處理這些動態,這樣您就不會用不必要的流量排出公共汽車。

+0

我認爲這會很好,如果它適用於OGL 2.0和其他事情:我幾乎沒有着色器的經驗。這是否意味着我應該以完全不同的方式處理粒子(通過使用着色器),或者這意味着什麼? – Dunkelbunt27

+0

對於OGL 2.0,您不能更改着色器上的位置,因此每個粒子都將是一個獨立對象,並且有兩種方法:動畫精靈和修改頂點座標;或者它們的一些混合。請注意,在某些平臺(例如windows)上,您需要明確創建2.0上下文,glew可以讓您的生活更輕鬆。 –

+0

我聽說過GLEW,但我遇到一些問題,包括Qt MinGW ... – Dunkelbunt27