0

我正在尝试使用 OpenGL ES 1.1 在我的 3D 世界中绘制粒子(在 2D 中)。

3D 世界(没有 2D 粒子)如下所示: 3D 世界没有粒子

当尝试在 3D 世界中绘制 2D 粒子时,它看起来像这样(注意网格现在以某种方式移动到左下角): 3D 世界尝试使用粒子

但是,我希望它直接在 3D 网格上绘制。关于如何实现这一点或为什么将其移至左下角的任何想法?

这是我到目前为止的工作。

- (void)drawFrame
{    
    [(EAGLView *)self.view setFramebuffer];

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/////////////  3D Drawing the Grid floor

    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glDepthMask(GL_TRUE);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    static GLfloat z = 0;
    gluLookAt(0, 5, -10, 0, 0, 0, 0, 1, 0);
    z += 0.075f;

    // Rotate the scene
    glRotatef(angle, 0, 1, 0);

    // Draw the Floor
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    glDisableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, zFloorVertices);
    glDrawArrays(GL_LINES, 0, 42);
    glVertexPointer(3, GL_FLOAT, 0, xFloorVertices);
    glDrawArrays(GL_LINES, 0, 42);

////////////  2D drawing the particle system

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrthof(0.0f, 320.0f, 0.0f, 480.0f, -100.0f, 100.0f);

    glDisable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);

    [explosion1 update:UPDATE_INTERVAL];

    if (explosion1.active != YES)
    {
        explosion1.sourcePosition = Vector2fMake(200, 200);
        explosion1.active = YES;
        explosion1.duration = 1;
        explosion1.sourcePositionVariance = Vector2fMake(0, rand() % 20);
    }

    [explosion1 renderParticles];

    [(EAGLView *)self.view presentFramebuffer];
}

- (void)initOpenGLES1
{
    // Set the clear color
    glClearColor(0, 0, 0, 1.0f);

    // Projection Matrix config
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    CGSize layerSize = self.view.layer.frame.size;
    gluPerspective(45.0f, (GLfloat)layerSize.width / (GLfloat)layerSize.height, 0.1f, 750.0f);

    // Modelview Matrix config
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // This next line is not really needed as it is the default for OpenGL ES
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDisable(GL_BLEND);

    // Enable depth testing
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glDepthMask(GL_TRUE);
}
4

1 回答 1

0

想通了,不得不重置 3D 渲染的 gluPerspective。

// 3D
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

CGSize layerSize = self.view.layer.frame.size;
gluPerspective(45.0f, (GLfloat)layerSize.width / (GLfloat)layerSize.height, 0.1f, 750.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); //gets rid of any rotations, movement, or other changes to the virtual world and puts us back at the origin standing upright

.... 
于 2013-04-15T19:34:02.650 回答