Algorithm 检测后期处理GLSL着色器上的灯光位置

Algorithm 检测后期处理GLSL着色器上的灯光位置,algorithm,opengl,graphics,glsl,shader,Algorithm,Opengl,Graphics,Glsl,Shader,我正在尝试应用体积散射后处理,如从现在提取的,我有如下内容: float4 main(float2 texCoord : TEXCOORD0) : COLOR0 { // Calculate vector from pixel to light source in screen space. half2 deltaTexCoord = (texCoord - ScreenLightPos.xy); // Divide by number of samples and scale

我正在尝试应用体积散射后处理,如从现在提取的,我有如下内容:

 float4 main(float2 texCoord : TEXCOORD0) : COLOR0  
{  
// Calculate vector from pixel to light source in screen space.  
half2 deltaTexCoord = (texCoord - ScreenLightPos.xy);  
// Divide by number of samples and scale by control factor.  
deltaTexCoord *= 1.0f / NUM_SAMPLES * Density;  
// Store initial sample.  
half3 color = tex2D(frameSampler, texCoord);  
// Set up illumination decay factor.  
half illuminationDecay = 1.0f;  
// Evaluate summation from Equation 3 NUM_SAMPLES iterations.  
for (int i = 0; i < NUM_SAMPLES; i++)  
{  
// Step sample location along ray.  
texCoord -= deltaTexCoord;  
// Retrieve sample at new location.  
half3 sample = tex2D(frameSampler, texCoord);  
// Apply sample attenuation scale/decay factors.  
sample *= illuminationDecay * Weight;  
// Accumulate combined color.  
color += sample;  
// Update exponential decay factor.  
illuminationDecay *= Decay;  
}  
// Output final color with a further scale control factor.  
return float4( color * Exposure, 1);  
}  
float4 main(float2 texCoord:TEXCOORD0):COLOR0
{  
//计算屏幕空间中从像素到光源的矢量。
half2 deltaTexCoord=(texCoord-ScreenLightPos.xy);
//除以样本数,再除以控制因子。
deltaTexCoord*=1.0f/NUM_样本*密度;
//储存初始样品。
half3 color=tex2D(帧采样器,texCoord);
//设置照明衰减因子。
半照明度Cay=1.0f;
//计算公式3中的总和NUM_SAMPLES迭代。
对于(int i=0;i

但是这个着色器需要均匀的灯光位置,我在想,是否有可能用后期处理材质检测灯光在屏幕中的位置,以及我如何做到这一点。有什么想法吗?

单词“detect”听起来像是在试图使用帧缓冲区中的信息来估计灯光的位置。没有什么好办法

相反,使用(在OpenGL应用程序中)将灯光的位置传递到着色器中。您需要在着色器顶部附近声明灯光位置:

uniform vec2 ScreenLightPos;
const vec2 ScreenLightPos = vec2(0.5, 0.5);
如果灯光从不移动,则可以使其在着色器中的位置保持不变:

uniform vec2 ScreenLightPos;
const vec2 ScreenLightPos = vec2(0.5, 0.5);
或者,如果光线可以预测地移动,则可以计算其位置作为时间的函数:

vec2 ScreenLightPos = vec2(sin(time), cos(time));
基本上,在着色器运行之前,您需要知道灯光的位置。无论您是在进行后期处理还是在进行表面照明,这都是正确的


如果绝对没有其他方法,您可能可以使用或更糟糕的是,检测帧缓冲区上的亮区。这将是可怕的缓慢,你仍然需要使用glUniform通过的位置,一旦你知道你的光是。如果这不是一个选项,您可以在着色器中使用嵌套循环在整个帧缓冲区中搜索亮点。我不会解释怎么做或者为什么这是一个可怕的想法。

我不能在我的图形引擎中使用HDR纹理,这就是我为什么要问的问题。你试图解决的问题与试图确定用于照亮照片中场景的光源的位置是无法区分的。对于某些设置,这是可能的(多个镜面反射),对于其他设置,这是不可能的(仅平面的漫反射照明)。无论如何,你要解决的问题是计算机视觉的一个难题,也是一个正在进行的研究课题。在任何情况下,它都需要大量的计算,并且绝对不是渲染场景时要采用的方法。请将此放在透视图中:CV上解决此问题的当前方法是使用概率方法在图片中重新创建场景,使用现代全局照明方法进行渲染,将其与照片进行比较,并进行迭代,直到获得接近的匹配。