【问题标题】:Detect light position on a post-process GLSL shader检测后处理 GLSL 着色器上的灯光位置
【发布时间】:2023-04-05 08:05:01
【问题描述】:

我正在尝试应用从Nvidia GPU Gems 3 中提取的体积散射后处理,现在我有这样的东西:

 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);  
}  

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

【问题讨论】:

  • 我不能在我的图形引擎中使用 HDR 纹理,这就是我要求这样做的原因。
  • 您尝试解决的问题与尝试确定用于照亮照片中场景的光源的位置没有区别。对于某些设置是可能的(多次镜面反射),对于其他设置是不可能的(仅平面表面的漫射照明)。无论如何,你要解决的问题是计算机视觉的一个难题,也是一个正在进行的研究课题。在任何情况下,它都需要大量计算,并且绝对不是您在渲染场景时想要采用的方法。
  • 换个角度看:目前CV上解决这个问题的方法是用概率的方法在一张图片中重新创建场景,用现代的全局光照方法渲染,对比一下photo 并迭代它,直到达到接近匹配。

标签: algorithm opengl graphics glsl shader


【解决方案1】:

“检测”一词听起来像是您正在尝试使用帧缓冲区中的信息来估计灯光的位置。没有好办法。

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

uniform vec2 ScreenLightPos;

如果灯光从不移动,您可以将其位置设置为着色器中的常量:

const vec2 ScreenLightPos = vec2(0.5, 0.5);

或者,如果光线可预测地移动,您可以计算它的位置作为时间的函数:

vec2 ScreenLightPos = vec2(sin(time), cos(time));

基本上,您需要在着色器运行之前知道灯光在哪里。无论您是在进行后期处理还是表面光照,都是如此。

如果绝对没有其他方法,您也许可以使用compute shader 或更糟糕的是pixel reading 来检测帧缓冲区上的明亮区域。这将非常慢,一旦你弄清楚你的光在哪里,你仍然需要使用 glUniform 来传递位置。如果即使这样也不是一种选择,您可以在着色器中使用嵌套循环来搜索整个帧缓冲区中的亮点。我不会解释如何做到这一点或为什么这是一个可怕的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多