Я пытаюсь использовать этот радиальный шейдер в сферах, но безуспешно.проблема связана с координатами экрана.Шейдер работает, только если сфера находится в центре экрана, как показано на следующих рисунках:
, если я перемещаю камеру или объектВот что происходит:
Я обнаружил, что если я преобразую положение сферы в координаты экрана, шейдер работает нормально, как я показываюв этом коде, используя функцию 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;
}
проблема в том, что я хочу применить этот эффект к множеству сфер, ия не знаю, как это сделать, потому что я передаю положение сферы как равномерную переменную в радиальную шейдерную пост-обработку.
но на самом деле я хочу узнать, как применить тот или иной шейдерк сеткам и не иметь дело с этой проблемой каждый раз (как насчет того, чтобы у шейдера не было униформы для определения положения объекта? какой способ заставить шейдер работать в экранных координатах? как это сделать? мне нужно немного светаВотпотому что я чувствую, что я что-то упустил
Это иллюстративное изображение того, что я хочу сделать:
, но я хочу шейдеры постобработки, которые могут иметь информациюобъектов и не всегда вычисляют эффект в центре экрана (в центре объекта есть то, что я хочу).пожалуйста, любые предложения будут уместны