OpenGL3.3_C++_Windows(14天空盒,环境映射)

demo演示

demo演示

天空盒

  1. 作用:
  2. 我们想要一个立方体每个面都有不同的纹理,可以在while使用:glActiveTexture(),激活绑定相应纹理,glVertexAttribPointer设置布局,glDrawArrays()设置绘制的顶点数(部分)
  3. 也可以使用立方体贴图,立方体贴图有一个非常有用的特性,它可以通过一个方向向量来进行索引/采样,比如天空盒,我们就可以根据方向向量,计算出对应的像素,从而映射到被影响的物体上。
  4. 我们将把6张纹理合并到一张纹理中,直接通过samplerCube采样器映射到立方体上,从而每个顶点能够正确从纹理采样,获取相应的颜色值,输出到颜色缓冲中。
  5. 如何采样纹理:
  6. 和Vec2  TexCoord不同的是,当立方体的中心位于原点,将所有顶点的纹理坐标(vec3在3维坐标采样) 当作 立方体的顶点位置(vec3),
  7. 通过使用立方体的实际位置向量进行采样(只关心矢量的方向,方向向量的原点位于它的中心,会根据所击中的纹素,并返回对应的采样纹理值)
  8. 天空盒:与普通的立方体有些区别
  9. 天空盒特性:
    1. 渲染了普通的立方体(没有model变换,将默认位于世界中心),但是因为view中的位移存在,立方体随着摄像机(反转)运动,想让玩家(坐标原点)永远位于立方体中,可以通过:移除立方体的位移        :
glm::mat4 view = glm::mat4(glm::mat3(camera.GetViewMatrix()));  
    1. 需要渲染在所有物体的后面:可以将输出位置的z分量等于它的w分量,当透视除法执行之后,z永远变为1,深度值永远是最大的
  1. 代码

    1. 将6个路径添加到vector<std::string>数组中,创建6个纹理,这回绑定到GL_TEXTURE_CUBE_MAP……,接着调用glTexImage2D(),需要告诉专门对应立方体贴图的一个面,这些参数都是连续的,可以通过GL_TEXTURE_CUBE_MAPX + i实现
    2. 环绕方式:3D纹理:str坐标轴设置
    3. vertex glsl中将位置向量作为输出给片段着色器的纹理坐标

环境映射:

对环境光简单近似的处理,并非基于物理的

  1. 反射:让当前片段的颜色 =从贴图中获取经过reflect的方向向量,对应的颜色值
  2. 折射:材质都有自己的折射率,决定了材质中光线弯曲的程度,
  3. 计算折射率:光线/视线从x进入y = x折射率  / y折射率
  4. 计算方向向量:依旧通过refract,第3个参数传入折射率ratio

demo问题

  1. glTexImage2D和glTextureStorage2D的区别:
    1. glTexImage2D允许在每次调用时改变纹理图像的大小和格式,可能会降低一些性能
    2. glTextureStorage2D纹理的尺寸和格式就固定下来,不可更改,使用不可变存储可以提高性能
  2. 解决调整窗口大小时物体形变问题:
    1. 原因:在顶点由局部坐标——屏幕坐标的过程的映射时,如果投影矩阵的纵横比非窗口(framebuffer_size_callback()获取到这个值)的比例,映射时会发生形变
    2. 解决:在while中更新投影矩阵的纵横比
    3. 帧缓冲原因:纹理 / 渲染缓冲 附件的大小非窗口大小,将纹理映射到四边形上,发生形变
    4. 解决:同样在while中更新附件的纵横比
  3. 多重渲染(MRT):片段着色器可以输出多个颜色值,可以分别保存到不同的颜色缓冲区中,可以通过glReadBuffer()从哪个颜色缓冲区读取数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值