簡體   English   中英

GL_POINTS 着色器中的示例紋理

[英]Sample texture in GL_POINTS shaders

我有一個着色器,它用固體 colors 繪制粒子。 我想讓着色器對 FBO 紋理進行采樣,以便每個粒子都可以作用於它“背后”的顏色。 似乎它應該很簡單,但沒有。

我已經簡化了代碼,因此我希望我的 FBO 被繪制在每個粒子的表面上,並按比例縮小。 丑陋,但至少可以證明我的粒子可以對紋理進行采樣。 相反,每個粒子只是一種純色。 我正在使用 OpenFrameworks,所以有一些抽象。 我已經驗證tex.bind()綁定到第一個紋理位置,並且我能夠在沒有GL_POINTS的情況下將着色器應用於 FBO。

這是我設置着色器、繪制 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;
}

而不是gl_TexCoord[0].st你需要gl_PointCoord.st

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM