Добавление матрицы проекции к открытым точкам спрайтов, эффект частиц, вершинный шейдер - PullRequest
2 голосов
/ 14 декабря 2011

Я изучал OpenGLES из руководства по программированию OpenGLES 2.0.У них есть эффект частиц, который выглядит как взрыв.Я пытаюсь улучшить их пример кода, добавив матрицу проекции mat4 в вершинный шейдер, шейдер компилируется и работает, но у меня возникают проблемы с получением эффекта положения с учетом проекции.Код, который у меня есть, выглядит следующим образом:

const char* ParticleExplosionVertexShader = STRINGIFY (

uniform float u_time;
uniform vec3 u_centerPosition;
uniform mat4 Projection;
attribute float a_lifetime;
attribute vec3 a_startPosition;
attribute vec3 a_endPosition;
varying float v_lifetime;

void main()
{
    if ( u_time <= a_lifetime )
    {
        gl_Position.xyz = a_startPosition + (u_time * a_endPosition);
        gl_Position.xyz += u_centerPosition;
        gl_Position.w = 1.0;
    }
    else
        gl_Position = vec4( -1000, -1000, 0, 0 );
    v_lifetime = 1.0 - ( u_time / a_lifetime );
    v_lifetime = clamp ( v_lifetime, 0.0, 1.0 );
    gl_PointSize = ( v_lifetime * v_lifetime ) * 40.0;
}

);

Я могу добавить проекцию в линию без каких-либо ошибок, но, к сожалению, здесь это на самом деле не требуется, так как этот код помещает объект d = screen наконец его жизненного цикла

gl_Position = Projection * vec4( -1000, -1000, 0, 0 );

Я также пытался изменить строку

gl_Position.xyz += u_centerPosition;

на

gl_Position += Projection * u_centerPosition;

Но мне не повезло получить его какЯ хочу это

Я что-то не так делаю?Или есть причина, по которой в книге не было матрицы проекции, например, что она не должна быть чем-то, что кто-то должен делать с точечными спрайтами?* Спасибо

Редактировать: Пожалуйста, дайте мне знать, если вам нужна дополнительная информация от меня

1 Ответ

0 голосов
/ 16 января 2012

Как насчет умножения всей позиции gl_Position на матрицу проекции вида модели, как с любой нормальной геометрией?

Кроме того, вам, вероятно, потребуется изменить строку, вычисляющую gl_PointSize, например, попробуйте разделить ее на gl_Position.w (после умножения на проекцию модели), иначе спрайты будут иметь одинаковый размер (это то, что вы пытаетесь исправить?).

...