gpt4 book ai didi

opengl - 如何在 GLSL 中实现 2D raycasting 光效

转载 作者:行者123 更新时间:2023-12-04 06:07:40 25 4
gpt4 key购买 nike

这最初是由@sydd 提出的 here .我对此很好奇,所以我尝试对其进行编码,但在我回答之前它已被关闭/删除,所以就在这里。

问题:如何复制/实现 this 中的 2D 光线转换照明效果GLSL ?

该效果本身从鼠标位置向各个方向转换光线,累积影响像素强度的背景贴图 alpha 和颜色。

所以输入应该是:

  • 鼠标位置
  • 背景RGBA贴图纹理
  • 最佳答案

  • 背景图

    好的,我创建了一个测试 RGBA 映射为 2 个图像,其中一个包含 RGB (在左侧)和第二个带有 Alpha channel (在右侧),因此您可以同时看到它们。粗的它们结合形成单个 RGBA 质地。

    RGB map alpha map

    我把它们都模糊了一点,以获得更好的边缘视觉效果。
  • 射线转换

    因为这应该在 中运行GLSL 我们需要将光线转换到某个地方。我决定在 做这件事片段着色器 .所以算法是这样的:
  • GL 着色器所需的侧通制服这里将鼠标位置作为纹理坐标、纹理的最大分辨率和光传输强度。
  • GL 侧边绘制四边形覆盖整个屏幕,背景纹理(o 混合)
  • 在顶点着色器上只需传递所需的纹理和片段坐标
  • 在每个片段的片段着色器上:
  • 将光线从鼠标位置转换到实际片段位置(在纹理坐标中)
  • 在光线传播过程中累积/整合光属性
  • 如果光强度接近零或达到目标片段位置,则停止。

  • 顶点着色器
    // Vertex
    #version 420 core
    layout(location=0) in vec2 pos; // glVertex2f <-1,+1>
    layout(location=8) in vec2 txr; // glTexCoord2f Unit0 <0,1>
    out smooth vec2 t1; // texture end point <0,1>
    void main()
    {
    t1=txr;
    gl_Position=vec4(pos,0.0,1.0);
    }

    片段着色器
    // Fragment
    #version 420 core
    uniform float transmit=0.99;// light transmition coeficient <0,1>
    uniform int txrsiz=512; // max texture size [pixels]
    uniform sampler2D txrmap; // texture unit for light map
    uniform vec2 t0; // texture start point (mouse position) <0,1>
    in smooth vec2 t1; // texture end point, direction <0,1>
    out vec4 col;
    void main()
    {
    int i;
    vec2 t,dt;
    vec4 c0,c1;
    dt=normalize(t1-t0)/float(txrsiz);
    c0=vec4(1.0,1.0,1.0,1.0); // light ray strength
    t=t0;
    if (dot(t1-t,dt)>0.0)
    for (i=0;i<txrsiz;i++)
    {
    c1=texture2D(txrmap,t);
    c0.rgb*=((c1.a)*(c1.rgb))+((1.0f-c1.a)*transmit);
    if (dot(t1-t,dt)<=0.000f) break;
    if (c0.r+c0.g+c0.b<=0.001f) break;
    t+=dt;
    }
    col=0.90*c0+0.10*texture2D(txrmap,t1); // render with ambient light
    // col=c0; // render without ambient light
    }

    最后结果:

    output

    动画 256 色 GIF:

    output animation

    由于 8 位截断,GIF 中的颜色略有失真。此外,如果动画停止刷新页面或在 decend gfx 查看器中打开。

    light inside semitransparent object

    关于opengl - 如何在 GLSL 中实现 2D raycasting 光效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34708021/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com