Glsl 如何避免碎片着色器中的额外计算

Glsl 如何避免碎片着色器中的额外计算,glsl,shader,Glsl,Shader,我正在尝试修复这个着色器。效果是围绕点位置的径向模糊,从阵列中的cpu传递。每个点的计算都很好,并生成de效果,但正如您在这张图片中看到的,对于每个循环,着色器都会保持生成采样,我不知道如何避免。我只想要阵列中每个点的模糊 #version 150 in vec2 varyingtexcoord; uniform sampler2DRect tex0; uniform int size; float exposure = 0.79; float decay = 0.9; float den

我正在尝试修复这个着色器。效果是围绕点位置的径向模糊,从阵列中的cpu传递。每个点的计算都很好,并生成de效果,但正如您在这张图片中看到的,对于每个循环,着色器都会保持生成采样,我不知道如何避免。我只想要阵列中每个点的模糊

#version 150

in vec2 varyingtexcoord;
uniform sampler2DRect tex0;

uniform int size;

float exposure = 0.79;
float decay = 0.9;
float density = .9;
float weight = .1;
int samples = 25;

out vec4 fragColor;
const int MAX_SAMPLES = 25;
const int N = 3;
uniform vec2 ligthPos [N];

int a = 1;

vec4 halo(vec2 pos){

    float illuminationDecay = 1.2;
    vec2 texCoord = varyingtexcoord;
    vec2 current = pos.xy;
    vec2  deltaTextCoord = texCoord - current;

    deltaTextCoord *= 1.0 / float(samples) * density;
    vec4 color = texture(tex0, texCoord);

    for(int i=0; i < MAX_SAMPLES; i++){ 
        texCoord -= deltaTextCoord;

        vec4 sample = texture(tex0, texCoord);
        sample *= illuminationDecay * weight;
        color += sample;
        illuminationDecay *= decay;
    }
    return color;
}

void main(){

    vec4 accum = vec4(0.0);
    for(int e = 0; e < N;e++){

        vec2 current =ligthPos[e];
        accum += halo(current);
    }
    fragColor = (accum) * exposure;
}
#版本150
在vec2中,varyingtexcoord;
均匀取样器2DRECT tex0;
统一的整数大小;
浮动曝光=0.79;
浮动衰减=0.9;
漂浮密度=.9;
浮子重量=.1;
int样本=25;
out vec4 fragColor;
const int MAX_SAMPLES=25;
常数int N=3;
均匀vec2-ligthPos[N];
INTA=1;
vec4光环(vec2位置){
浮子照明度Cay=1.2;
vec2-texCoord=varyingtexcoord;
vec2电流=位置xy;
vec2 deltaTextCoord=texCoord-当前值;
deltaTextCoord*=1.0/浮子(样品)*密度;
vec4颜色=纹理(tex0,texCoord);
对于(int i=0;i
事情就是这样: