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

&spm=1001.2101.3001.5002&articleId=136845847&d=1&t=3&u=5c87b12f51d848fda2f9dc1bd26ac648)
5410

被折叠的 条评论
为什么被折叠?



