OpenGL实现全景图(SkyBox和Hdri双实现方式)

OpenGL全景图两种实现方式

1. 球形全景图

球形全景图的实现方式又叫environment mapping,它通过将场景中的物体映射到球形表面来实现。在OpenGL中,可以使用纹理映射来实现球形全景图。首先,需要创建一个球形模型,并将场景中的物体映射到球形模型的面上。然后,将球形模型的纹理映射到球形全景图的纹理上,最后,使用纹理映射的球形全景图来渲染场景。

球形全景图样例

在这方面,我们可以参考Lib Env - Shader API这篇文章说的hdri纹理解析方式

以及全景图shader这篇文章的shader设置

本质上,球形全景图的渲染就是将场景中的物体映射到球形模型的面上,然后使用球形模型的纹理来渲染场景。我们需要在shader中计算每个像素点在球形模型上的位置以及其向量方向,它使用了envIrradiance这个函数来计算给定方向的辐射度(irradiance)。它基于环境的球谐光照(spherical harmonics projection)来计算。这个函数返回一个RGB颜色值,表示在特定方向上的环境光照强度,同样也乘以了环境曝光。

在shader中,我们使用envIrradiance函数来计算每个像素点在球形模型上的位置以及其向量方向,然后使用球形模型的纹理来渲染场景。

在此我将提供一个shader的实现,它基于球形全景图的实现方式。

const GLchar *fragmentShaderSource3D = R"glsl(
    #version 100
    precision highp float;
    uniform vec2 iResolution; //分辨率
    uniform vec2 iMouse; //鼠标移动坐标
    uniform float iFov;  // 视场角uniform变量
    uniform sampler2D iChannel1;  // HDR环境贴图

    // 旋转变换
    vec3 rotateX(vec3 p, float a)
    {
        float sa = sin(a);
        float ca = cos(a);
        return vec3(p.x, ca*p.y - sa*p.z, sa*p.y + ca*p.z);
    }

    vec3 rotate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值