demo演示
demo演示
天空盒
作用: 我们想要一个立方体每个面都有不同的纹理,可以在while使用:glActiveTexture(),激活绑定相应纹理,glVertexAttribPointer设置布局,glDrawArrays()设置绘制的顶点数(部分) 也可以使用立方体贴图,立方体贴图有一个非常有用的特性,它可以通过一个方向向量来进行索引/采样,比如天空盒,我们就可以根据方向向量,计算出对应的像素,从而映射到被影响的物体上。 我们将把6张纹理合并到一张纹理中,直接通过samplerCube采样器映射到立方体上,从而每个顶点能够正确从纹理采样,获取相应的颜色值,输出到颜色缓冲中。 如何采样纹理: 和Vec2 TexCoord不同的是,当立方体的中心位于原点,将所有顶点的纹理坐标(vec3在3维坐标采样) 当作 立方体的顶点位置(vec3), 通过使用立方体的实际位置向量进行采样(只关心矢量的方向,方向向量的原点位于它的中心,会根据所击中的纹素,并返回对应的采样纹理值) 天空盒:与普通的立方体有些区别 天空盒特性: 渲染了普通的立方体(没有model变换,将默认位于世界中心),但是因为view中的位移存在,立方体随着摄像机(反转)运动,想让玩家(坐标原点)永远位于立方体中,可以通过:移除立方体的位移 :
glm::mat4 view = glm::mat4(glm::mat3(camera.GetViewMatrix()));
需要渲染在所有物体的后面:可以将输出位置的z分量等于它的w分量,当透视除法执行之后,z永远变为1,深度值永远是最大的 代码 :
将6个路径添加到vector<std::string>数组中,创建6个纹理,这回绑定到GL_TEXTURE_CUBE_MAP……,接着调用glTexImage2D(),需要告诉专门对应立方体贴图的一个面,这些参数都是连续的,可以通过GL_TEXTURE_CUBE_MAPX + i实现 环绕方式:3D纹理:str坐标轴设置 vertex glsl中将位置向量作为输出给片段着色器的纹理坐标 环境映射: 反射:让当前片段的颜色 =从贴图中获取经过reflect的方向向量,对应的颜色值 折射:材质都有自己的折射率,决定了材质中光线弯曲的程度, 计算折射率:光线/视线从x进入y = x折射率 / y折射率 计算方向向量:依旧通过refract,第3个参数传入折射率ratio
demo问题
glTexImage2D和glTextureStorage2D的区别: glTexImage2D允许在每次调用时改变纹理图像的大小和格式,可能会降低一些性能 glTextureStorage2D纹理的尺寸和格式就固定下来,不可更改,使用不可变存储可以提高性能 解决调整窗口大小时物体形变问题: 原因:在顶点由局部坐标——屏幕坐标的过程的映射时,如果投影矩阵的纵横比非窗口(framebuffer_size_callback()获取到这个值)的比例,映射时会发生形变 解决:在while中更新投影矩阵的纵横比 帧缓冲原因:纹理 / 渲染缓冲 附件的大小非窗口大小,将纹理映射到四边形上,发生形变 解决:同样在while中更新附件的纵横比 多重渲染(MRT):片段着色器可以输出多个颜色值,可以分别保存到不同的颜色缓冲区中,可以通过glReadBuffer()从哪个颜色缓冲区读取数据。