UE_Virtual Texture

在这里插入图片描述

Virtual Texture是一种允许实时大体量渲染纹理数据而通过虚拟映射将整体纹理数据放入显存连续采样的纹理技术方案,本技术基本上是现代图形引擎用于实时纹理渲染的核心技术(RVT)。

先来看一下本技术的主要优点:

  • 预混合纹理,大幅减少纹理带宽开销,尤其是地形
  • 有利于合批,尤其是要实现GPU-driven和光追时
  • 实现近处丰富的材质细节
  • 降低内存(显存)开销

接下来,我们大概来说一下本技术的原理:它主要是通过仅将当前视图所需的纹理的单个图块加载到内存中并将其余图块保留在设备硬盘上来实现的。一般 Virtual 指的是在操作系统的内存管理系统中使用的虚拟内存技术,其实虚拟纹理采用的也是类似的思路。

大体流程见下图:

在这里插入图片描述
上图也许太抽象了点,可以通过下图来了解其最基本的原理:

在这里插入图片描述
至于整体实现逻辑可见如下:
在这里插入图片描述

具体的实现的应用过程可见如下:
在这里插入图片描述

然后基于Virtual Texture的思路,衍生出了各种拓展算法,比如:Procedural Virtual Texture,Adaptive Procedural Virtual Texture,Hardware Virtual Texture等解决方案。

至于具体原理可以参照以下大佬们的资料,就不再详细归档了。

Adaptive Virtual Texture Rendering in Far Cry 4

how-can-virtual-texturing-actually-be-efficient

Sparse Virtual Textures

浅谈Virtual Texture

Virtual Texture in Modern Graphics API

Virtual Texture Mapping

Virtual Texture的意义是什么?

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是OpenGL中使用GLSL实现SAMPLE_DEPTH_TEXTURE的示例代码。 在vertex shader中,我们需要将顶点坐标和投影矩阵相乘得到裁剪坐标,然后将裁剪坐标传递给fragment shader。 ``` #version 330 layout(location = 0) in vec3 position; uniform mat4 projectionMatrix; void main() { gl_Position = projectionMatrix * vec4(position, 1.0); } ``` 在fragment shader中,我们首先需要从深度纹理中采样得到深度值,然后将其转换为线性深度值。转换方法可以根据具体场景进行调整。接着,我们可以根据深度值计算出该像素的位置,并将该位置作为颜色输出。 ``` #version 330 out vec4 outColor; uniform sampler2D depthTexture; uniform mat4 invProjectionMatrix; uniform vec2 viewportSize; void main() { vec2 texCoord = gl_FragCoord.xy / viewportSize; float depth = texture(depthTexture, texCoord).r; float linearDepth = 2.0 * near * far / (far + near - depth * (far - near)); vec4 clipPos = vec4(texCoord * 2.0 - 1.0, linearDepth, 1.0); vec4 viewPos = invProjectionMatrix * clipPos; viewPos /= viewPos.w; outColor = vec4(viewPos.xyz, 1.0); } ``` 注意,这里我们还需要传递投影矩阵的逆矩阵和视口大小,以便进行后续计算。 另外,由于OpenGL中默认深度值是非线性的,因此需要进行线性深度值的转换。上面的代码中使用了一种简单的转换方法,但在实际场景中可能需要根据具体情况进行调整。 最后,在主程序中,我们需要将深度纹理绑定到对应的纹理单元,并将投影矩阵和视口大小传递给shader。 ``` GLuint depthTexture; // 初始化深度纹理 glGenTextures(1, &depthTexture); glBindTexture(GL_TEXTURE_2D, depthTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // 绑定深度纹理到纹理单元0 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, depthTexture); glUniform1i(glGetUniformLocation(shaderProgram, "depthTexture"), 0); // 传递投影矩阵和视口大小 glm::mat4 projectionMatrix; GLfloat viewportSize[2]; glGetFloatv(GL_VIEWPORT, viewportSize); glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projectionMatrix"), 1, GL_FALSE, glm::value_ptr(projectionMatrix)); glUniform2fv(glGetUniformLocation(shaderProgram, "viewportSize"), 1, viewportSize); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值