void DispatchRays() { // update frame index and start path tracer _rayTracingShader.SetInt("_FrameIndex", _frameIndex); _rayTracingShader.SetShaderPass("DxrPass"); // // using e.g. ForwardDXR here will require binding all variables correctly, e.g. _EnvLightDatasRT // _rayTracingShader.SetShaderPass("ForwardDXR"); // var lightCluster = HDRenderPipeline.currentPipeline.RequestLightCluster(); // Shader.SetGlobalBuffer(HDShaderIDs._RaytracingLightCluster, lightCluster.GetCluster()); // Shader.SetGlobalBuffer(HDShaderIDs._LightDatasRT, lightCluster.GetLightDatas()); // Shader.SetGlobalBuffer(HDShaderIDs._EnvLightDatasRT, lightCluster.GetEnvLightDatas()); // start one thread for each pixel on screen _rayTracingShader.Dispatch("MyRaygenShader", _camera.pixelWidth, _camera.pixelHeight, 1, _camera); // update accumulation material _accumulationMaterial.SetTexture("_CurrentFrame", _dxrTarget); _accumulationMaterial.SetTexture("_Accumulation", _accumulationTarget1); _accumulationMaterial.SetInt("_FrameIndex", _frameIndex++); // accumulate current raytracing result Graphics.Blit(_dxrTarget, _accumulationTarget2, _accumulationMaterial); // switch accumulate textures var temp = _accumulationTarget1; _accumulationTarget1 = _accumulationTarget2; _accumulationTarget2 = temp; GetComponent <MeshRenderer>().sharedMaterial.mainTexture = resultTexture == ResultTexture.DxrTarget ? _dxrTarget : _accumulationTarget1; }
void OnRenderImage(RenderTexture src, RenderTexture dest) { if (!SystemInfo.supportsRayTracing || !rayTracingShader) { Debug.Log("The RayTracing API is not supported by this GPU or by the current graphics API."); Graphics.Blit(src, dest); return; } if (rayTracingAccelerationStructure == null) { return; } if (prevCameraMatrix != Camera.main.cameraToWorldMatrix) { convergenceStep = 0; } if (prevBounceCountOpaque != bounceCountOpaque) { convergenceStep = 0; } if (prevBounceCountTransparent != bounceCountTransparent) { convergenceStep = 0; } // Not really needed per frame if the scene is static. rayTracingAccelerationStructure.Build(); rayTracingShader.SetShaderPass("PathTracing"); Shader.SetGlobalInt(Shader.PropertyToID("g_BounceCountOpaque"), (int)bounceCountOpaque); Shader.SetGlobalInt(Shader.PropertyToID("g_BounceCountTransparent"), (int)bounceCountTransparent); // Input rayTracingShader.SetAccelerationStructure(Shader.PropertyToID("g_AccelStruct"), rayTracingAccelerationStructure); rayTracingShader.SetFloat(Shader.PropertyToID("g_Zoom"), Mathf.Tan(Mathf.Deg2Rad * Camera.main.fieldOfView * 0.5f)); rayTracingShader.SetFloat(Shader.PropertyToID("g_AspectRatio"), cameraWidth / (float)cameraHeight); rayTracingShader.SetInt(Shader.PropertyToID("g_ConvergenceStep"), convergenceStep); rayTracingShader.SetInt(Shader.PropertyToID("g_FrameIndex"), Time.frameCount); rayTracingShader.SetTexture(Shader.PropertyToID("g_EnvTex"), envTexture); // Output rayTracingShader.SetTexture(Shader.PropertyToID("g_Radiance"), rayTracingOutput); rayTracingShader.Dispatch("MainRayGenShader", (int)cameraWidth, (int)cameraHeight, 1, Camera.main); Graphics.Blit(rayTracingOutput, dest); convergenceStep++; prevCameraMatrix = Camera.main.cameraToWorldMatrix; prevBounceCountOpaque = bounceCountOpaque; prevBounceCountTransparent = bounceCountTransparent; }
private void OnRenderImage(RenderTexture source, RenderTexture destination) { CheckNulls(); CheckRenderTexture(); SetShaderProperties(); _RTAS.Update(); shader.Dispatch("RayGen", cam.pixelWidth / (int)resolution, cam.pixelHeight / (int)resolution, 1, cam); Graphics.Blit(source, destination); }
void OnRenderImage(RenderTexture source, RenderTexture destination) { PathTracingShader.SetInt("_Frame", _Frame); PathTracingShader.Dispatch("RayGenerationShader", _Camera.pixelWidth, _Camera.pixelHeight, 1, _Camera); _Material.SetTexture("_MainImage", _RenderTarget0); _Material.SetTexture("_Accumulation", _RenderTarget1); _Material.SetInt("_Frame", _Frame++); Graphics.Blit(_RenderTarget0, _RenderTarget2, _Material); Graphics.Blit(_RenderTarget2, destination); var target = _RenderTarget1; _RenderTarget1 = _RenderTarget2; _RenderTarget2 = target; }
/// <summary> /// Ray tracing to check whether plane1 can see plane2 by GPU. /// </summary> /// <param name="plane1">the plane1.</param> /// <param name="plane2">the plane2.</param> /// <returns>the result.</returns> public bool RayTracingPlane2PlaneGPU(Plane plane1, Plane plane2) { var viewRect = new Rect(0F, 0F, math.ceil(plane1.size.x / rayTracingStep.x), math.ceil(plane1.size.y / rayTracingStep.x)); var renderTarget = RequireRenderTarget(ref viewRect); var resultBuffer = RequireResultBuffer(); bakeRayTraceShader.SetShaderPass("PVS"); bakeRayTraceShader.SetAccelerationStructure(_accelerationStructureShaderId, accelerationStructure); bakeRayTraceShader.SetTexture(_resultShaderId, renderTarget); bakeRayTraceShader.SetVector(_viewLeftBottomCornerShaderId, plane1.leftBottomCorner); bakeRayTraceShader.SetVector(_viewRightDirShaderId, plane1.rightDir); bakeRayTraceShader.SetVector(_viewUpDirShaderId, plane1.upDir); bakeRayTraceShader.SetVector(_viewSizeShaderId, plane1.size); bakeRayTraceShader.SetVector(_targetLeftBottomCornerShaderId, plane2.leftBottomCorner); bakeRayTraceShader.SetVector(_targetRightDirShaderId, plane2.rightDir); bakeRayTraceShader.SetVector(_targetUpDirShaderId, plane2.upDir); bakeRayTraceShader.SetVector(_targetSizeShaderId, plane2.size); bakeRayTraceShader.SetVector(_rayTracingStepShaderId, rayTracingStep); bakeRayTraceShader.Dispatch("BakeRaygenShader", (int)viewRect.width, (int)viewRect.height, 1); var data = new byte[] { 0, 0, 0, 0 }; resultBuffer.SetData(data); var kernelId = countPixelComputeShader.FindKernel("CSMain"); countPixelComputeShader.SetTexture(kernelId, _pixelsShaderId, renderTarget); countPixelComputeShader.SetInt(_widthShaderId, (int)viewRect.width); countPixelComputeShader.SetInt(_heightShaderId, (int)viewRect.height); countPixelComputeShader.SetBuffer(kernelId, _resultShaderId, resultBuffer); countPixelComputeShader.GetKernelThreadGroupSizes(kernelId, out var grpSizeX, out var grpSizeY, out var _); countPixelComputeShader.Dispatch(kernelId, (int)math.ceil(viewRect.width / grpSizeX), (int)math.ceil(viewRect.height / grpSizeY), 1); resultBuffer.GetData(data); return(data[0] > 0); }
public void OnRenderImage(RenderTexture src, RenderTexture dest) { var cam = Camera.main; if (!CheckResources(cam)) { Graphics.Blit(src, dest); return; } //-- shader pass "RTPass" in material shaders rtShader.SetShaderPass("RTPass"); //- set global variables, used in all material shaders Shader.SetGlobalVector(ShaderID._T_minmax, new Vector2(tMin, tMax)); //-- set local RT raygen shader variables _rtAccStructure.Build(); rtShader.SetAccelerationStructure(ShaderID._SceneAccelerationStructure, _rtAccStructure); rtShader.SetTexture(ShaderID._RenderTarget, _rtTargetTexture); rtShader.SetMatrix(ShaderID._InvViewMatrix, cam.cameraToWorldMatrix); rtShader.SetTexture(ShaderID._EnvironmentTex, environmentCubemap); rtShader.SetFloat(ShaderID._EnvironmentGamma, Mathf.GammaToLinearSpace(environmentExposure)); rtShader.SetFloat(ShaderID._ShadowBrightness, shadowBrightness); var camOrigin = cam.transform.position; var frustumBottomLeftDirWS = (cam.ViewportToWorldPoint(new Vector3(0, 0, cam.nearClipPlane)) - camOrigin).normalized; var frustumBottomRightDirWS = (cam.ViewportToWorldPoint(new Vector3(1, 0, cam.nearClipPlane)) - camOrigin).normalized; var frustumTopLeftDirWS = (cam.ViewportToWorldPoint(new Vector3(0, 1, cam.nearClipPlane)) - camOrigin).normalized; rtShader.SetVector(ShaderID._FrustumBottomLeftDirWS, frustumBottomLeftDirWS); rtShader.SetVector(ShaderID._FrustumHorizDirWS, frustumBottomRightDirWS - frustumBottomLeftDirWS); rtShader.SetVector(ShaderID._FrustumVertDirWS, frustumTopLeftDirWS - frustumBottomLeftDirWS); //-- dispatch ray tracing rtShader.Dispatch("RaygenShader", cam.pixelWidth, cam.pixelHeight, 1); Graphics.Blit(_rtTargetTexture, dest); }
private void OnRenderImage(RenderTexture source, RenderTexture destination) { // update frame index and start path tracer _rayTracingShader.SetInt("_FrameIndex", _frameIndex); // start one thread for each pixel on screen _rayTracingShader.Dispatch("MyRaygenShader", _camera.pixelWidth, _camera.pixelHeight, 1, _camera); // update accumulation material _accumulationMaterial.SetTexture("_CurrentFrame", _dxrTarget); _accumulationMaterial.SetTexture("_Accumulation", _accumulationTarget1); _accumulationMaterial.SetInt("_FrameIndex", _frameIndex++); // accumulate current raytracing result Graphics.Blit(_dxrTarget, _accumulationTarget2, _accumulationMaterial); // display result on screen Graphics.Blit(_accumulationTarget2, destination); // switch accumulate textures var temp = _accumulationTarget1; _accumulationTarget1 = _accumulationTarget2; _accumulationTarget2 = temp; }
void DispatchRays() { // update frame index and start path tracer _rayTracingShader.SetInt("_FrameIndex", _frameIndex); _rayTracingShader.SetShaderPass("DxrPass"); // // using e.g. ForwardDXR here will require binding all variables correctly, e.g. _EnvLightDatasRT // _rayTracingShader.SetShaderPass("ForwardDXR"); // var lightCluster = HDRenderPipeline.currentPipeline.RequestLightCluster(); // Shader.SetGlobalBuffer(HDShaderIDs._RaytracingLightCluster, lightCluster.GetCluster()); // Shader.SetGlobalBuffer(HDShaderIDs._LightDatasRT, lightCluster.GetLightDatas()); // Shader.SetGlobalBuffer(HDShaderIDs._EnvLightDatasRT, lightCluster.GetEnvLightDatas()); _rayTracingShader.SetFloat("_JitterAmount", resultTexture == ResultTexture.DxrTarget ? 0 : 1); _rayTracingShader.SetBool("_UseLensData", lensRenderer && lensRenderer.isActiveAndEnabled); if (lensRenderer) { _rayTracingShader.SetMatrix("_DataProviderTransform", lensRenderer.transform.localToWorldMatrix); _rayTracingShader.SetTexture("_PositionData", lensRenderer.lensPositionTex); _rayTracingShader.SetTexture("_DirectionData", lensRenderer.lensDirectionTex); } else { _rayTracingShader.SetTexture("_PositionData", Texture2D.whiteTexture); _rayTracingShader.SetTexture("_DirectionData", Texture2D.whiteTexture); } // start one thread for each pixel on screen _rayTracingShader.Dispatch("MyRaygenShader", _dxrTarget.width, _dxrTarget.height, 1, _camera); // update accumulation material _accumulationMaterial.SetTexture("_CurrentFrame", _dxrTarget); _accumulationMaterial.SetTexture("_Accumulation", _accumulationTarget1); _accumulationMaterial.SetInt("_FrameIndex", _frameIndex++); // accumulate current raytracing result Graphics.Blit(_dxrTarget, _accumulationTarget2, _accumulationMaterial); // switch accumulate textures var temp = _accumulationTarget1; _accumulationTarget1 = _accumulationTarget2; _accumulationTarget2 = temp; // // apply DLSS to the _dxrTarget // var cmd = new CommandBuffer(); // var initData = new DLSSCommandInitializationData() // { // featureFlags = DLSSFeatureFlags.DoSharpening, // inputRTHeight = (uint)_dxrTarget.height, // inputRTWidth = (uint)_dxrTarget.width, // outputRTWidth = (uint)(2 * _dxrTarget.width), // outputRTHeight = (uint)(2 * _dxrTarget.height), // quality = DLSSQuality.MaximumPerformance // }; // // var context = _nvidiaDevice.CreateFeature(cmd, initData); // var textureTable = new DLSSTextureTable() // { // colorInput = _dxrTarget, // colorOutput = null, // depth = null, // motionVectors = null, // }; // _nvidiaDevice.ExecuteDLSS(cmd, context, new DLSSTextureTable()); GetComponent <MeshRenderer>().sharedMaterial.mainTexture = resultTexture == ResultTexture.DxrTarget ? _dxrTarget : _accumulationTarget1; }