public void Execute(RenderWrap renderWrap) { var texInput = renderWrap.GetRenderTexture2D(input); var texOutput = renderWrap.GetRenderTexture2D(output); int width = texInput.width; int height = texInput.height; renderWrap.SetRootSignature(rs); renderWrap.SetSRV(texInput, 0); renderWrap.SetUAV(texOutput, 0, 0); var writer = renderWrap.Writer; writer.Write(width); writer.Write(height); writer.SetCBV(0); renderWrap.Dispatch(shader, null, (width + 15) / 16, (height + 15) / 16); int x = width; int y = height; for (int i = 1; i < 9; i++) { x = (x + 1) / 2; y = (y + 1) / 2; writer.Write(x); writer.Write(y); writer.SetCBV(0); renderWrap.SetSRVLim(texOutput, i - 1, 0); renderWrap.SetUAV(texOutput, i, 0); renderWrap.Dispatch(shader, null, (x + 15) / 16, (y + 15) / 16); } }
public bool Bake(TextureCube texture, RenderWrap renderWrap, ref object tag) { var tex = renderWrap.GetTexCube(Source); if (tex == null || tex.Status != GraphicsObjectStatus.loaded) { return(false); } int currentQuality; if (tag is int val) { currentQuality = val; } else { currentQuality = 0; } renderWrap.SetRootSignature("Csu"); int width = texture.width; int height = texture.height; var writer = renderWrap.Writer; int roughnessLevel = 5; { int t1 = roughnessLevel + 1; int face = 0; int mipLevel = currentQuality % t1; int quality = currentQuality / t1; int pow2a = 1 << mipLevel; writer.Write(width / pow2a); writer.Write(height / pow2a); writer.Write(quality); writer.Write(quality); writer.Write(Math.Max(mipLevel * mipLevel / (4.0f * 4.0f), 1e-3f)); writer.Write(face); writer.SetCBV(0); renderWrap.SetSRV(tex, 0); renderWrap.SetUAV(texture, mipLevel, 0); if (mipLevel != roughnessLevel) { renderWrap.Dispatch("PreFilterEnv.hlsl", null, width / 8 / pow2a, height / 8 / pow2a, 6); } else { renderWrap.Dispatch("IrradianceMap.hlsl", null, width / 8 / pow2a, height / 8 / pow2a, 6); } currentQuality++; } tag = currentQuality; if (currentQuality < 256) { return(false); } else { return(true); } }