2014-02-08 6 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); 

는 아무것도 (검은 화면)이 표시되지 않습니다 이쪽으로. 나는 내가해야 할 일을 혼자 생각할 수 없다.

나는 무엇을 그리워 않은 : 나는 실제로 알고 싶은 무엇

? 즉, Sprite를 사용하여 항상 최신 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의 경우 쉐이더에서 위치를 변경할 수 없으므로 각 입자는 독립적 인 개체가 될 수 있으며 움직이는 스프라이트 및 수정 된 꼭지점 좌표; 또는 그들 중 일부 하이브리드. 일부 플랫폼 (예 : 윈도우)에서는 명시 적으로 2.0 컨텍스트를 만들어야하며 glew는 인생을 훨씬 쉽게 만들어줍니다. –

+0

GLEW에 대해 들었지만 Qt MinGW에 문제가 있습니다. – Dunkelbunt27

관련 문제