OpenGL - 快速精灵绘图 - 需要一些指导

时间:2014-02-08 16:21:40

标签: c++ qt opengl sprite

我的程序使用OpenGL创建并绘制粒子系统。 我完全使用了glBegin()和glEnd(),但后来我注意到它已经过时了,根本不应该使用它。所以我开始用glDrawArrays();

重写它

我看起来像这样:

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绘制大量的粒子,这些粒子始终处于运动状态?

1 个答案:

答案 0 :(得分:0)

您要使用哪个OpenGL版本?

OGL 2.0ES,2.1,3.0及更高版本之间存在细微差别,但您基本上需要着色器并减少数据的更改/上传,对于粒子系统,这些动态可以在着色器侧处理,以便您不会耗尽公共汽车有不必要的交通。