您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

104 行
4.0 KiB

using UnityEngine.Assertions;
using UnityEngine.Rendering;
namespace UnityEngine.Experimental.Rendering
{
public class BC6H
{
public static BC6H DefaultInstance;
static readonly int _Source = Shader.PropertyToID("_Source");
static readonly int _Target = Shader.PropertyToID("_Target");
static readonly int _MipIndex = Shader.PropertyToID("_MipIndex");
static readonly int[] __Tmp_RT =
{
Shader.PropertyToID("__Tmp_RT0"),
Shader.PropertyToID("__Tmp_RT1"),
Shader.PropertyToID("__Tmp_RT2"),
Shader.PropertyToID("__Tmp_RT3"),
Shader.PropertyToID("__Tmp_RT4"),
Shader.PropertyToID("__Tmp_RT5"),
Shader.PropertyToID("__Tmp_RT6"),
Shader.PropertyToID("__Tmp_RT7"),
Shader.PropertyToID("__Tmp_RT8"),
Shader.PropertyToID("__Tmp_RT9"),
Shader.PropertyToID("__Tmp_RT10"),
Shader.PropertyToID("__Tmp_RT11"),
Shader.PropertyToID("__Tmp_RT12"),
Shader.PropertyToID("__Tmp_RT13")
};
readonly ComputeShader m_Shader;
readonly int m_KEncodeFastCubemapMip;
public BC6H(ComputeShader shader)
{
Assert.IsNotNull(shader);
m_Shader = shader;
m_KEncodeFastCubemapMip = m_Shader.FindKernel("KEncodeFastCubemapMip");
uint x, y, z;
m_Shader.GetKernelThreadGroupSizes(m_KEncodeFastCubemapMip, out x, out y, out z);
}
// Only use mode11 of BC6H encoding
public void EncodeFastCubemap(CommandBuffer cmb, RenderTargetIdentifier source, int sourceSize, RenderTargetIdentifier target, int fromMip, int toMip)
{
var maxMip = Mathf.Max(0, (int)(Mathf.Log(sourceSize) / Mathf.Log(2)) - 2);
var actualFromMip = (int)Mathf.Clamp(fromMip, 0, maxMip);
var actualToMip = (int)Mathf.Min(maxMip, Mathf.Max(toMip, actualFromMip));
// Convert TextureCube source to Texture2DArray
var d = new RenderTextureDescriptor
{
autoGenerateMips = false,
bindMS = false,
colorFormat = RenderTextureFormat.ARGBInt,
depthBufferBits = 0,
dimension = TextureDimension.Tex2DArray,
enableRandomWrite = true,
msaaSamples = 1,
volumeDepth = 6,
sRGB = false,
useMipMap = false,
};
cmb.SetComputeTextureParam(m_Shader, m_KEncodeFastCubemapMip, _Source, source);
for (var mip = actualFromMip; mip <= actualToMip; ++mip)
{
var size = (sourceSize >> mip) >> 2;
d.width = size;
d.height = size;
cmb.GetTemporaryRT(__Tmp_RT[mip], d);
}
for (var mip = actualFromMip; mip <= actualToMip; ++mip)
{
var size = (sourceSize >> mip) >> 2;
cmb.SetComputeTextureParam(m_Shader, m_KEncodeFastCubemapMip, _Target, __Tmp_RT[mip]);
cmb.SetComputeIntParam(m_Shader, _MipIndex, mip);
cmb.DispatchCompute(m_Shader, m_KEncodeFastCubemapMip, size, size, 6);
}
for (var mip = fromMip; mip <= toMip; ++mip)
{
var rtMip = Mathf.Clamp(mip, actualFromMip, actualToMip);
for (var faceId = 0; faceId < 6; ++faceId)
cmb.CopyTexture(__Tmp_RT[rtMip], faceId, 0, target, faceId, mip);
}
for (var mip = actualFromMip; mip <= actualToMip; ++mip)
cmb.ReleaseTemporaryRT(__Tmp_RT[mip]);
}
}
public static class BC6HExtensions
{
public static void BC6HEncodeFastCubemap(this CommandBuffer cmb, RenderTargetIdentifier source, int sourceSize, RenderTargetIdentifier target, int fromMip, int toMip)
{
BC6H.DefaultInstance.EncodeFastCubemap(cmb, source, sourceSize, target, fromMip, toMip);
}
}
}