首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于点的遮光掩模

基于点的遮光掩模
EN

Game Development用户
提问于 2015-03-02 16:50:42
回答 1查看 1.1K关注 0票数 1

所以我有一个场景,完全基于2D精灵。我想把“光源”渲染成一个独立的帧缓冲器(大部分是圆点,例如,火焰的中心),然后用我的“照明”阴影渲染整个场景,使光源“着色”周围的像素,主要是通过将一个像素和光源的颜色混合在一起,这取决于它与最近的光源的距离。

问题:我应该在这里应用什么概念来获得我想要的结果?我现在做错什么了?

我这里有几幅概念图:

没有灯光的场景:

包含光源的场景的帧缓冲区(火焰的顶部黄色像素):

将帧缓冲区呈现为带有辉光着色器的纹理的结果。我还“模拟”了第二个缓冲器,半径较小,同一位置有黄灯。

或者,更接近我的第一个方法的想法,想象整个帧缓冲区的第二个像素透明,但点在中心。

我无法快速模拟的是灯光的渐变,使其边缘变暗,中心处变亮。

当前的想法需要符合这个片段着色器的布局:

#version 400 uniform sampler2D color_map; layout(std140) uniform Sprite { vec2 position; vec2 size; vec2 position_in_texture; vec2 size_in_texture; float rotation; }; in vec2 texture_coordinate; layout(std140) uniform Color { vec4 color; }; layout(location = 0) out vec4 out_color; void main(){ vec4 tex_color = texture2D(color_map, texture_coordinate); vec2 diff; vec2 norm; vec2 sample_coordinate; out_color = tex_color; int radius = 4; int count = 1; norm = vec2(radius/size.x, radius/size.y); for(int i=-radius; i < radius; i++){ //Sample each pixel around the one rendered right now and add it's color to the current one with a certain gradient factor for(int j=-radius; j < radius; j++){ diff = vec2(i/size.x, j/size.y); sample_coordinate = texture_coordinate + diff; if(0.0 <= sample_coordinate.x && sample_coordinate.x <= 1.0 && 0.0 <= sample_coordinate.y && sample_coordinate.y <= 1.0){ tex_color = texture2D(color_map, sample_coordinate); if(tex_color != vec4(0.0,0.0,0.0,0.0) && sample_coordinate != texture_coordinate && length(diff) <= length(norm)){ out_color = (out_color * count + tex_color * (1.0 - (length(diff) / length(norm)))) / (count+1); count++; } } } } }

我计划将半径变量作为另一个统一元素传递给它。由于我在那里所做的事情,我没有得到我想要的结果。

虽然通过实验,我得到了这个我喜欢的光影,但是标志的边缘仍然太暗了(从原来的上方离开过去的框架,这是正确的):

EN

回答 1

Game Development用户

发布于 2015-03-02 17:07:27

你做错了-效率很低。而不是渲染光源到您的“照明框架缓冲区”,渲染照明的贡献。这将是一个软磁盘,以您的光源为中心,而不是一个像素。示例磁盘:

..。你可以把它渲染成精灵!(添加剂共混,夹紧至1以获得最佳效果)。

现在,您可以绑定该照明帧缓冲区,只需对感兴趣的texel位置进行示例,就可以直接获得照明贡献。

如果您想自己创建纹理,就像编写这样的着色器一样简单:(通过着色玩具运行)

代码语言:javascript
复制
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord.xy / iResolution.xy;
    float d = length(uv - 0.5); // distance to center
    float c = 1.0-smoothstep(0.3,0.5,d); // apply smoothing curve
    fragColor = vec4(c,c,c,1.0);
}
票数 4
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/95952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档