我的程序使用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粒子?
您必須先將頂點數據提交給GPU,然後才能通過頂點緩衝區對象或頂點數組對象渲染頂點數據,然後使用着色器渲染頂點。 [本教程在教授現代opengl方面做得很好](http://open.gl/drawing) – rcapote
我將會看看本教程,感謝您的回覆。 – Dunkelbunt27