я пытаюсь реализовать какой-то световой эффект в сфере.Идея состоит в том, что он излучает свет объемным образом в направлении нормальных векторов.но я не знаю точно, как я могу это сделать.
мой фрагментный шейдер таков, я реализую «радиальное» размытие, и он работает хорошо, но только когда камера обращена к сфере.
когда нет, это происходит;
я пытаюсь следовать этому примеру, но безуспешно:
https://medium.com/@andrew_b_berg/volumetric-light-scattering-in-three-js-6e1850680a41
эточто я пытаюсь получить:
это мой код:
import controlP5.*;
ControlP5 cp5;
import peasy.*;
PGraphics canvas;
PGraphics verticalBlurPass;
PShader blurFilter;
PeasyCam cam;
void setup()
{
cam = new PeasyCam(this, 1400);
size(1000, 1000, P3D);
canvas = createGraphics(width, height, P3D);
verticalBlurPass = createGraphics(width, height, P3D);
verticalBlurPass.noSmooth();
blurFilter = loadShader("bloomFrag.glsl", "blurVert.glsl");
}
void draw(){
background(0);
canvas.beginDraw();
render(canvas);
canvas.endDraw();
// blur vertical pass
verticalBlurPass.beginDraw();
verticalBlurPass.shader(blurFilter);
verticalBlurPass.image(canvas, 0, 0);
//render(verticalBlurPass);
verticalBlurPass.endDraw();
cam.beginHUD();
image(verticalBlurPass, 0, 0);
cam.endHUD();
println(frameRate);
}
void render(PGraphics pg)
{
cam.getState().apply(pg);
pg.background(0, 50);
pg.stroke(255, 0, 0);
canvas.fill(100, 0, 255);
canvas.fill(255);
pg.noStroke();
canvas.sphere(100);
pg.noFill();
pg.stroke(255);
pg.strokeWeight(10);
}
вершина:
#version 150
in vec4 position;
in vec3 normal;
uniform mat4 transform;
in vec2 texCoord;
out vec4 TexCoord;
in vec3 color;
out vec3 Color;
uniform float u_time;
uniform mat4 texMatrix;
void main() {
Color = color;
TexCoord = texMatrix * vec4(texCoord, 1.0, 1.0);
gl_Position = transform * position ;
}
фрагмент:
#version 150
#define PROCESSING_TEXTURE_SHADER
#ifdef GL_ES
precision mediump float;
#endif
in vec4 TexCoord;
in vec3 Color;
uniform sampler2D texture;
uniform float u_time;
uniform float amt;
uniform float intensity;
uniform float x;
uniform float y;
uniform float noiseAmt;
uniform float u_time2;
out mediump vec4 fragColor;
vec4 finalColor;
#define PI 3.14
uniform vec2 lightPosition = vec2(0,0);
uniform float exposure = 0.09;
uniform float decay = .95;
uniform float density = 1.0;
uniform float weight = 1;
uniform int samples = 100;
const int MAX_SAMPLES = 100;
uniform vec2 resolution; // screen resolution
void main(){
vec2 texCoord = TexCoord.xy;
// Calculate vector from pixel to light source in screen space
vec2 deltaTextCoord = texCoord - lightPosition;
// Divide by number of samples and scale by control factor
deltaTextCoord *= 1.0 / float(samples) * density;
// Store initial sample
vec4 color = texture(texture, texCoord);
// set up illumination decay factor
float illuminationDecay = 1.0;
// evaluate the summation for samples number of iterations up to 100
for(int i=0; i < MAX_SAMPLES; i++){
// work around for dynamic number of loop iterations
if(i == samples){
break;
}
// step sample location along ray
texCoord -= deltaTextCoord;
// retrieve sample at new location
vec4 color2 = texture(texture, texCoord);
// apply sample attenuation scale/decay factors
color2 *= illuminationDecay * weight;
// accumulate combined color
color += color2;
// update exponential decay factor
illuminationDecay *= decay;
}
// output final color with a further scale control factor
fragColor = color * exposure;
}
есть идеи?что я делаю не так?