OpenGL Cube Map Texturing

本文深入探讨了Cubemap纹理在实时渲染中的应用,包括其原理、特性以及在创建真实反射镜面体和透明体时的优势。重点介绍了如何利用Cubemap纹理实现环境映射,以及在OpenGL环境中进行纹理设置和采样的具体步骤。

都是非纯2D的texture

cube map  texture可以理解为6个面的纸盒, sample的时候使用vector射线型的sample.

volume texture可以理解是一摞2D texture,sample的时候用第几摞+2D坐标来sample.

虽然都是非2D,sample都用3维数据,差异大啊.

CubeMap 在实时渲染中应用十分广泛. 通过视线和法线计算出的反射光线来查询CubeMap
可以创建一个真实的反射镜面体, 通过视线和法线计算出的折射光线来查询CubeMap
可以创建一个透明体. 由于查询速度快的原因,在实时的CG渲染中应用十分的广泛.

我们的CubeMap大都是从外部的图片得来的, 图片是不可以变化的, 故是静态的. 
但问题是, 如果有其他物体在反射物体外运动. 如果我们仅仅查询静态的CubeMap
是不能够反射到动态物体的影象,所以我们需要一个动态的CubeMap, 即我们需要Render to 

Preface
red book 上对于一些内容的讲解,确实比较简略,比如 cube map texturing。
GL 1.2 时,cube map texturing 还是作为 extension 存在,目前 2.1/3.0 早已成为正式标准。

这里有详细的介绍,看完就懂了。
http://developer.nvidia.com/object/cube_map_ogl_tutorial.html

Cube Mapping Explained
对于金属直感的物体,会映射出周围场景的环境(environment mapping),如何在程序中模拟出这个效果呢,cube map texturing 是一种方法。其他方法如:sphere mapping、dual paraboloid mapping 等等。

对于 cube map texturing,其实就是用6张贴图(6 targets),一个 cube,作为当前物体的环境贴图(environment),在绘制物体时,不同的点,会对应到不同的 target 上,取得不同的 tex pixel 信息。

对于 (x, y, z),哪个值最大,就选取那个为 mayor(ma)。
major axis 
direction     target                                                            sc      tc     ma
 
----------          ---------------------------------                                              ---       ---      ---
  
+rx             GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT    -rz      -ry     rx
  
-rx               GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT   +rz    -ry     rx
  
+ry             GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT     +rx    +rz   ry
  
-ry               GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT   +rx     -rz    ry
  
+rz             GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT    +rx    -ry     rz
  
-rz              GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT    -rx     -ry     rz  

s   =   ( sc/|ma| + 1 ) / 2 
t   =   ( tc/|ma| + 1 ) / 2

sc / |ma| = -1.0 ~ 1.0
(sc / |ma| + 1)/2 = 0.0 ~ 1.0
对于每个 target surface,s/t 会映射为:
(0.0, 0.0)
       +-----------------------------+
        |                       |
        |                       |
        |                       |
       +-----------------------------+
                           (1.0, 1.0)

Sample
---- init ----
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_CUBE_MAP, texName);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, mytex1);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, mytex2);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, mytex3);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, mytex4);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, mytex5);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, mytex6);

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);

---- draw it ----
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_CUBE_MAP);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBindTexture(GL_TEXTURE_CUBE_MAP, texName);

glutSolidSphere(1.0, 30, 10);

对于 mytex1 ~ 6 就是简单的 64x64 single-color texture。使用 cube mapping 也只是设置到 target 即可。
[ogl] Cube Map Texturing - kasicass - Code@Pig Home
1 课程简介:本课程详细讲解了OpenGL从入门到精通的理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了基础图元绘制,基础光照,高级过程,高级光照等内容;当前图形引擎的应用已经越来越广泛,春晚以及各大综艺节目已经开始使用XR作为主流的内容制作技术,房地产漫游及Web渲染技术已经开始茁壮发展,VR也即将突破硬件瓶颈;普遍的游戏引擎在独特的领域已经无法完全实用,且我们国家要发展自主科技技术,图形引擎以及CAD等卡脖子技术一定会蓬勃发展,所以同学们要抓住机会,趁势而上,熟悉底层,博取更大发展,学习OpenGL底层接口的应用以及图形学算法,将是您向纵深发展的第一步!2 课程解决优势:很多同学学习OpenGL最难的是找到路径,并且其中牵扯到的理论知识点无法完全理解透彻(比如VAO与VBO的区别,MVP矩阵变换的推导及原理,光照系统的设计及算法推导,帧缓存的灵活应用等),我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解OpenGL当中的必要接口,并且可以对图形学的基础知识融会贯通,可以制作中级的特效。并且对于UnrealEngine以及Unity3D的学习更加轻松,对于各类商业引擎当中的算法以及内容制作手法更加深刻理解把控。学员也可以自行进行图形引擎的设计以及研究,并且将本课程的知识点进行代码模块化编写;能够自主推导图形学管线以及应用当中的各类公式,并且理解其几何含义。 代码与PPT资源,已随课程附赠,请同学们对应课程下载 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值