[gpu pro]virtual texture mapping

GpuPro的文章,还是一个系列的第一部最经典啊。

概念

讲virtual texture mapping,这个我们完全可以和OS里面的virtual memory进行对比,理念很像,当然不同肯定是有的。

  • 处理memory逻辑和物理之间mapping问题,物理中只放一部分逻辑的memory,vtm中这个“物理部分”就叫tile cache,是一个大texture,里面atlas很多小tile
  • 使用page来做最小管理单位:tile
  • 有一个page table样的东西:indirection texture
  • page fault了就读入需要的部分
  • page fault handler是比较复杂的部分,需要考虑很多因素,lod,压缩。。。
实现细节
  • page fault generation
    • 这个需要判定virtual texture coordinate和mipmaplevel,uv好判断,mipmap level稍微麻烦,用ddx,ddy来做,mip=log(max(|ddx|,|ddy|)
  • page handler
    • 压缩,使用jpg类的压缩,降低io压力
    • 把tiles压到一个文件里面,来简化硬盘seek
    • 减少mipmap存储,实时计算一部分
    • cache saturation:cache满了的时候,使用LRU来去掉不再用的,再不行把一些不重要的(对画面影响小的)去掉,或者把高精度的降成低精度
    • tile upload(to gpu),dx9上使用managed memory,driver来搞定
    • indirection texture update:tile更新了之后,重新建立indirection texture,这个indirection texture是mipmap状的(或者说是金字塔状的),
  • render
    • 渲染的话比较麻烦的是tile的texture filtering,处理方法是在tile外面加一个4pixel的border

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Projective texture mapping in Unity Shader is a technique used to project a texture onto an object in a way that simulates the effect of a slide projector. It can be used to create various effects like projecting a spotlight texture onto a surface, projecting a decal onto a curved surface, or creating a shadow map for an object. To implement projective texture mapping in Unity Shader, you need to use a combination of vertex and fragment shaders. The vertex shader calculates the projective transformation matrix, which is used to transform the texture coordinates in the fragment shader. The fragment shader samples the texture and applies it to the object's surface. Here's a simple example of a vertex shader that calculates the projective transformation matrix: ``` Shader "Custom/ProjectiveTextureMapping" { Properties { _MainTex ("Texture", 2D) = "white" {} _Projector ("Projector", 3D) = "" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag uniform sampler2D _MainTex; uniform float4x4 unity_Projector; float4x4 unity_ObjectToWorld; struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = mul(unity_Projector, v.vertex).xy; return o; } fixed4 frag (v2f i) : SV_Target { return tex2D(_MainTex, i.uv); } ENDCG } } } ``` In this example, the `_MainTex` property is the texture to be projected, and the `_Projector` property is the object that will project the texture. The `unity_Projector` variable is a matrix that transforms the texture coordinates from object space to clip space. The `vert` function calculates the transformed texture coordinates and passes them to the fragment shader in the `v2f` struct. The fragment shader simply samples the texture using the transformed texture coordinates and returns the color. You can use this shader by assigning it to a material and setting the `_MainTex` and `_Projector` properties to appropriate textures and objects, respectively.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值