Пример текстуры в шейдерах GL_POINTS - PullRequest
3 голосов
/ 30 апреля 2011

У меня есть шейдер, который рисует частицы сплошными цветами. Я хотел бы позволить шейдеру сэмплировать текстуру FBO, чтобы каждая частица могла воздействовать на цвет «позади». Похоже, все должно быть довольно просто, но нет.

Я упростил код, так что я ожидал, что мой FBO будет нарисован на поверхности каждой частицы в уменьшенном масштабе. Ужасно, но это, по крайней мере, докажет, что мои частицы могут пробовать текстуру. Вместо этого каждая частица - просто сплошной цвет. Я использую OpenFrameworks, поэтому есть несколько абстракций. Я проверил, что tex.bind() привязывается к первой локации текстуры, и я могу применять шейдеры к FBO без GL_POINTS.

Вот где я настраиваю свой шейдер, рисую FBO и визуализирую частицы:

void Particles::draw(ofxFBOTexture &tex){
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE);
        ofEnableSmoothing();
        glEnable(GL_POINT_SPRITE_ARB);
        glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_ARB);
        glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE, GL_TRUE);
                shader.begin();
                        shader.setUniform("winWidth", (float) width);
                        shader.setUniform("winHeight", (float) height);
                        tex.draw(0,0); // I've tried tex.bind() here too    

                        for(int i = 0; i < lastDead; i++){
                                allParticles[i]->draw(this->shader);
                        }

                shader.end();
        glDisable(GL_VERTEX_PROGRAM_POINT_SIZE_ARB);
        glDisable(GL_POINT_SPRITE_ARB);
        ofDisableSmoothing();
        glDisable(GL_BLEND);
}
// <snip>
void Particle::draw(ofxShader &shader){
        if(dead) return;

        // this must go outside glBegin
        shader.setAttribute("size", size);
        shader.setAttribute("velocity", xVel, yVel, 0.0);

        glBegin(GL_POINTS);
                glColor4f(r, g, b, multiplier * 0.8);
                glVertex3f(x, y, 0);
        glEnd();
}

Вот мой вершинный шейдер:

#version 120
attribute float size;
attribute vec3 velocity;
varying vec3 vel;
uniform float winWidth;
uniform float winHeight;

void main() {
        gl_PointSize = size;
        gl_FrontColor = gl_Color;

        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
        gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

        vel = velocity;
}

... и соответствующий отрывок из моего фрагментного шейдера, упрощенный для отладки:

#version 120
#extension GL_ARB_texture_rectangle : enable
varying vec3 vel;
uniform sampler2DRect tex;
uniform float winWidth;
uniform float winHeight;

void main() {
        vec4 texColor = texture2DRect(tex, gl_TexCoord[0].st);
        gl_FragColor = texColor;
}

1 Ответ

3 голосов
/ 30 апреля 2011

Вместо gl_TexCoord[0].st вам нужно gl_PointCoord.st .

...