Как сделать экранный координатный шейдер - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь использовать этот радиальный шейдер в сферах, но безуспешно.проблема связана с координатами экрана.Шейдер работает, только если сфера находится в центре экрана, как показано на следующих рисунках:

enter image description here

, если я перемещаю камеру или объектВот что происходит:

enter image description here

Я обнаружил, что если я преобразую положение сферы в координаты экрана, шейдер работает нормально, как я показываюв этом коде, используя функцию cam.worldToScreen():

fbo.begin();
ofClear(0);
cam.begin();

shader.begin();

sphere.setRadius(10);
sphere.setPosition(v.x, v.y, v.z);
sphere.draw();
shader.end();

cam.end();
fbo.end();



depthFbo.begin();
ofClear(0);
fbo.getDepthTexture().draw(0,0);
ofSetColor(255);

depthFbo.end();


radialBuffer.begin();
ofClear(0);
radial.begin();

f = cam.worldToScreen(v);
radial.setUniform3f("ligthPos", f.x, f.y, f.z);

radial.setUniformTexture("depth", depthFbo.getTexture(), 1);
fbo.draw(0,0);
radial.end();
radialBuffer.end();

radialBuffer.draw(0,0);

, и это шейдер:

#version 150

in vec2 varyingtexcoord;
uniform sampler2DRect tex0;
uniform sampler2DRect depth;

uniform vec3 ligthPos;
 float exposure = 0.19;
 float decay = 0.9;
 float density = 2.0;
 float weight = 1.0;
 int samples = 25;

out vec4 fragColor;
const int MAX_SAMPLES = 100;
void main()
{
//        float sampleDepth = texture(depth, varyingtexcoord).r;
//    
//        vec4 H = vec4 (varyingtexcoord.x *2 -1, (1- varyingtexcoord.y)*2 -1, sampleDepth, 1);
//    
//    vec4 = mult(H, gl_ViewProjectionMatrix);

    vec2 texCoord = varyingtexcoord;
    vec2 deltaTextCoord = texCoord - ligthPos.xy;
    deltaTextCoord *= 1.0 / float(samples) * density;
    vec4 color = texture(tex0, texCoord);
    float illuminationDecay = .6;
    for(int i=0; i < MAX_SAMPLES; i++)
    {
        if(i == samples){
            break;
        }
        texCoord -= deltaTextCoord;
        vec4 sample = texture(tex0, texCoord);
        sample *= illuminationDecay * weight;
        color += sample;
        illuminationDecay *= decay;
    }
    fragColor = color * exposure;
}

проблема в том, что я хочу применить этот эффект к множеству сфер, ия не знаю, как это сделать, потому что я передаю положение сферы как равномерную переменную в радиальную шейдерную пост-обработку.

но на самом деле я хочу узнать, как применить тот или иной шейдерк сеткам и не иметь дело с этой проблемой каждый раз (как насчет того, чтобы у шейдера не было униформы для определения положения объекта? какой способ заставить шейдер работать в экранных координатах? как это сделать? мне нужно немного светаВотпотому что я чувствую, что я что-то упустил

Это иллюстративное изображение того, что я хочу сделать:

enter image description here

, но я хочу шейдеры постобработки, которые могут иметь информациюобъектов и не всегда вычисляют эффект в центре экрана (в центре объекта есть то, что я хочу).пожалуйста, любые предложения будут уместны

...