C++学习(三三六)球面贴图Sphere mapping 立方体贴图Cube mapping

本文介绍了C++中两种贴图技术:球面贴图和立方体贴图。球面贴图通过计算物体顶点的反射向量确定纹理坐标,实现对物体表面的环境映射。立方体贴图则是通过捕捉场景六个方向的纹理,利用反射向量找到对应面的交点映射到纹理坐标。这两种方法在3D图形渲染中有广泛应用。
摘要由CSDN通过智能技术生成

1、球面贴图

1.1原理

在一幅平面纹理图像中对各个方向的颜色进行编码就相当于把一个擦得锃亮的完美球体放在环境的中央,然后在极远处用长焦镜头对它进行拍照。需要编码的区域就是覆盖整个纹理图像的一个圆形区域,它与纹理图像的顶、底、左、右边缘相切。这个圆形区域之外的纹理值不会对结果产生影响,因为它们不会在环境纹理中使用。

              如下图:

在对实际物体进行纹理贴图时,根据实际物体上的反射向量去计算上述球体上的法线向量,通过法线向量确定纹理坐标。

1.2实现

计算出物体上某顶点的反射向量,然后通过和(0,0,1)(opengl坐标)相加再除以2得到球面的法线,法线的值就是球面坐标,然后通过球面坐标对应到纹理相应的点。

假设球面坐标 S(a,b,c)(归一化后的坐标)

则纹理坐标 T(u,v):

u = a / 2 +0.5

v = -b / 2 +0.5

顶点处理器:

// Sphere Mapping Shader
// Vertex Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130
 
// Incoming per vertex... position and normal
in vec4 vVertex;
in vec3 vNormal;
 
uniform mat4   mvpMatrix;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 C++ 的代码实现: ```cpp #include <iostream> using namespace std; // Shape 基类 class Shape { public: virtual float getVolume() = 0; // 纯虚函数,获取体积 virtual float getSurfaceArea() = 0; // 纯虚函数,获取表面积 }; // Sphere 圆球体类,继承自 Shape 基类 class Sphere : public Shape { private: float radius; // 圆球体半径 public: Sphere(float r) : radius(r) {} // 构造函数 float getVolume() { // 实现获取体积的纯虚函数 return (4.0 / 3.0) * 3.14159 * radius * radius * radius; } float getSurfaceArea() { // 实现获取表面积的纯虚函数 return 4.0 * 3.14159 * radius * radius; } }; // Cube 立方体类,继承自 Shape 基类 class Cube : public Shape { private: float sideLength; // 立方体边长 public: Cube(float l) : sideLength(l) {} // 构造函数 float getVolume() { // 实现获取体积的纯虚函数 return sideLength * sideLength * sideLength; } float getSurfaceArea() { // 实现获取表面积的纯虚函数 return 6.0 * sideLength * sideLength; } }; int main() { // 创建圆球体和立方体对象 Sphere sphere(2.0); Cube cube(3.0); // 输出圆球体的表面积和体积 cout << "Sphere surface area: " << sphere.getSurfaceArea() << endl; cout << "Sphere volume: " << sphere.getVolume() << endl; // 输出立方体的表面积和体积 cout << "Cube surface area: " << cube.getSurfaceArea() << endl; cout << "Cube volume: " << cube.getVolume() << endl; return 0; } ``` 输出结果: ``` Sphere surface area: 50.2654 Sphere volume: 33.5103 Cube surface area: 54 Cube volume: 27 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值