diff --git a/URasterizer/Assembly-CSharp.csproj b/URasterizer/Assembly-CSharp.csproj index 75c4d5a401c213c5c0d9d552a64191fb266db6f5..774b7e007eb0369f6f017b97fdf8dd5e6f63f193 100644 --- a/URasterizer/Assembly-CSharp.csproj +++ b/URasterizer/Assembly-CSharp.csproj @@ -62,8 +62,12 @@ + - + + + + C:/Program Files/Unity/Hub/Editor/Unity 2020.3.25f1c1/Editor/Data/Managed/UnityEngine/UnityEngine.dll diff --git a/URasterizer/Assets/Samples/Scenes/TestScene01.unity b/URasterizer/Assets/Samples/Scenes/TestScene01.unity index 0d00e49701ad5e7f14c9382a4586a2aa8886e1ec..f73f3c164394bd780be833ffa3d2db375892099f 100644 --- a/URasterizer/Assets/Samples/Scenes/TestScene01.unity +++ b/URasterizer/Assets/Samples/Scenes/TestScene01.unity @@ -465,6 +465,7 @@ Transform: - {fileID: 270156317} - {fileID: 1326646622} - {fileID: 949938250} + - {fileID: 1976593447} m_Father: {fileID: 1977655288} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -716,6 +717,102 @@ Animator: m_HasTransformHierarchy: 1 m_AllowConstantClipSamplingOptimization: 1 m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!1 &1976593446 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1976593447} + - component: {fileID: 1976593450} + - component: {fileID: 1976593449} + - component: {fileID: 1976593448} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1976593447 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1976593446} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.57, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1651153439} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1976593448 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1976593446} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 275ec1cd091f7d54cb532cf4c552b27a, type: 3} + m_Name: + m_EditorClassIdentifier: + mesh: {fileID: 0} + DoubleSideRendering: 0 +--- !u!23 &1976593449 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1976593446} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1976593450 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1976593446} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1977655287 GameObject: m_ObjectHideFlags: 0 diff --git a/URasterizer/Assets/Samples/Scenes/TestScene02.unity b/URasterizer/Assets/Samples/Scenes/TestScene02.unity index 114a2ed4bd8563c24fa36762097ccc99d580493b..6d314ee519e4eff18c16f0501c1e6555eb00ef26 100644 --- a/URasterizer/Assets/Samples/Scenes/TestScene02.unity +++ b/URasterizer/Assets/Samples/Scenes/TestScene02.unity @@ -161,7 +161,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 2100000, guid: f9f96ee2bf6b64945b16abad7a676453, type: 2} + - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -400,7 +400,6 @@ GameObject: - component: {fileID: 1297680263} - component: {fileID: 1297680262} - component: {fileID: 1297680261} - - component: {fileID: 1297680260} - component: {fileID: 1297680264} - component: {fileID: 1297680265} m_Layer: 0 @@ -410,20 +409,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!64 &1297680260 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1297680259} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} --- !u!23 &1297680261 MeshRenderer: m_ObjectHideFlags: 0 diff --git a/URasterizer/Assets/URasterizer/Codes/CPURasterizer.cs b/URasterizer/Assets/URasterizer/Codes/CPURasterizer.cs index 188a6cd637134f8f9d2ee9b3a8cb134a5d4cb38b..a6abc154ad2a11fd4bf98fab6bce01514cb2f48c 100644 --- a/URasterizer/Assets/URasterizer/Codes/CPURasterizer.cs +++ b/URasterizer/Assets/URasterizer/Codes/CPURasterizer.cs @@ -13,25 +13,7 @@ namespace URasterizer Matrix4x4 _matModel; Matrix4x4 _matView; - Matrix4x4 _matProjection; - - public Matrix4x4 ModelMatrix - { - get => _matModel; - set => _matModel = value; - } - - public Matrix4x4 ViewMatrix - { - get => _matView; - set => _matView = value; - } - - public Matrix4x4 ProjectionMatrix - { - get => _matProjection; - set => _matProjection = value; - } + Matrix4x4 _matProjection; Color[] frame_buf; float[] depth_buf; @@ -126,7 +108,7 @@ namespace URasterizer public void Clear(BufferMask mask) { - ProfileManager.BeginSample("Rasterizer.Clear"); + ProfileManager.BeginSample("CPURasterizer.Clear"); if (_config.MSAA != MSAALevel.Disabled && !_config.WireframeMode) { @@ -156,43 +138,48 @@ namespace URasterizer ProfileManager.EndSample(); - } + } - public void SetupViewProjectionMatrix(Camera camera) + public void SetupUniforms(Camera camera, Light mainLight) { - //左手坐标系转右手坐标系,以下坐标和向量z取反 - var camPos = camera.transform.position; - camPos.z *= -1; - var lookAt = camera.transform.forward; - lookAt.z *= -1; - var up = camera.transform.up; - up.z *= -1; - - ViewMatrix = TransformTool.GetViewMatrix(camPos, lookAt, up); - - if (camera.orthographic) + switch (_config.FragmentShaderType) { - float halfOrthHeight = camera.orthographicSize; - float halfOrthWidth = halfOrthHeight * Aspect; - float f = -camera.farClipPlane; - float n = -camera.nearClipPlane; - ProjectionMatrix = TransformTool.GetOrthographicProjectionMatrix(-halfOrthWidth, halfOrthWidth, -halfOrthHeight, halfOrthHeight, f, n); - } - else - { - ProjectionMatrix = TransformTool.GetPerspectiveProjectionMatrix(camera.fieldOfView, Aspect, camera.nearClipPlane, camera.farClipPlane); + case ShaderType.VertexColor: + CurrentFragmentShader = ShaderContext.FSVertexColor; + break; + case ShaderType.BlinnPhong: + CurrentFragmentShader = ShaderContext.FSBlinnPhong; + break; + case ShaderType.NormalVisual: + CurrentFragmentShader = ShaderContext.FSNormalVisual; + break; + default: + CurrentFragmentShader = ShaderContext.FSBlinnPhong; + break; } + + ShaderContext.Config = _config; + + var camPos = camera.transform.position; + camPos.z *= -1; + ShaderContext.Uniforms.WorldSpaceCameraPos = camPos; + + var lightDir = mainLight.transform.forward; + lightDir.z *= -1; + ShaderContext.Uniforms.WorldSpaceLightDir = -lightDir; + ShaderContext.Uniforms.LightColor = mainLight.color * mainLight.intensity; + ShaderContext.Uniforms.AmbientColor = _config.AmbientColor; + + TransformTool.SetupViewProjectionMatrix(camera, Aspect, out _matView, out _matProjection); } - public void Draw(RenderingObject ro, Camera camera) + public void DrawObject(RenderingObject ro) { - ProfileManager.BeginSample("Rasterizer.Draw"); + ProfileManager.BeginSample("CPURasterizer.DrawObject"); Mesh mesh = ro.mesh; - - SetupViewProjectionMatrix(camera); - - ModelMatrix = ro.GetModelMatrix(); + + _matModel = ro.GetModelMatrix(); Matrix4x4 mvp = _matProjection * _matView * _matModel; Matrix4x4 normalMat = _matModel.inverse.transpose; @@ -533,7 +520,7 @@ namespace URasterizer private void RasterizeWireframe(Triangle t) { - ProfileManager.BeginSample("Rasterizer.RasterizeWireframe"); + ProfileManager.BeginSample("CPURasterizer.RasterizeWireframe"); DrawLine(t.Vertex0.Position, t.Vertex1.Position, t.Vertex0.Color, t.Vertex1.Color); DrawLine(t.Vertex1.Position, t.Vertex2.Position, t.Vertex1.Color, t.Vertex2.Color); DrawLine(t.Vertex2.Position, t.Vertex0.Position, t.Vertex2.Color, t.Vertex0.Color); @@ -547,7 +534,7 @@ namespace URasterizer //Screen space rasterization void RasterizeTriangle(Triangle t, RenderingObject ro) { - ProfileManager.BeginSample("Rasterizer.RasterizeTriangle"); + ProfileManager.BeginSample("CPURasterizer.RasterizeTriangle"); var v = _tmpVector4s; v[0] = t.Vertex0.Position; v[1] = t.Vertex1.Position; @@ -703,7 +690,7 @@ namespace URasterizer bool IsInsideTriangle(int x, int y, Triangle t, float offsetX=0.5f, float offsetY=0.5f) { - ProfileManager.BeginSample("Rasterizer.IsInsideTriangle"); + ProfileManager.BeginSample("CPURasterizer.IsInsideTriangle"); var v = _tmpVector3s; v[0] = new Vector3(t.Vertex0.Position.x, t.Vertex0.Position.y, t.Vertex0.Position.z); v[1] = new Vector3(t.Vertex1.Position.x, t.Vertex1.Position.y, t.Vertex1.Position.z); @@ -738,7 +725,7 @@ namespace URasterizer Vector3 ComputeBarycentric2D(float x, float y, Triangle t) { - ProfileManager.BeginSample("Rasterizer.ComputeBarycentric2D"); + ProfileManager.BeginSample("CPURasterizer.ComputeBarycentric2D"); var v = _tmpVector4s; v[0] = t.Vertex0.Position; v[1] = t.Vertex1.Position; @@ -770,7 +757,7 @@ namespace URasterizer public void UpdateFrame() { - ProfileManager.BeginSample("CameraRenderer.UpdateFrame"); + ProfileManager.BeginSample("CPURasterizer.UpdateFrame"); switch (_config.DisplayBuffer) { diff --git a/URasterizer/Assets/URasterizer/Codes/CameraRenderer.cs b/URasterizer/Assets/URasterizer/Codes/CameraRenderer.cs index b93b8acafcaddac6b749049850a85b03683dc37a..7efee0b01513ccc81a0814607217bf8621402383 100644 --- a/URasterizer/Assets/URasterizer/Codes/CameraRenderer.cs +++ b/URasterizer/Assets/URasterizer/Codes/CameraRenderer.cs @@ -33,7 +33,9 @@ namespace URasterizer private void OnPostRender() { - Render(); + if(_config.EnableRendering){ + Render(); + } } void Init() @@ -88,39 +90,14 @@ namespace URasterizer var r = _rasterizer; r.Clear(BufferMask.Color | BufferMask.Depth); - switch (_config.FragmentShaderType) - { - case ShaderType.VertexColor: - r.CurrentFragmentShader = ShaderContext.FSVertexColor; - break; - case ShaderType.BlinnPhong: - r.CurrentFragmentShader = ShaderContext.FSBlinnPhong; - break; - case ShaderType.NormalVisual: - r.CurrentFragmentShader = ShaderContext.FSNormalVisual; - break; - default: - r.CurrentFragmentShader = ShaderContext.FSBlinnPhong; - break; - } - - ShaderContext.Config = _config; - - var camPos = transform.position; - camPos.z *= -1; - ShaderContext.Uniforms.WorldSpaceCameraPos = camPos; - - var lightDir = _mainLight.transform.forward; - lightDir.z *= -1; - ShaderContext.Uniforms.WorldSpaceLightDir = -lightDir; - ShaderContext.Uniforms.LightColor = _mainLight.color * _mainLight.intensity; - ShaderContext.Uniforms.AmbientColor = _config.AmbientColor; + r.SetupUniforms(_camera, _mainLight); + for (int i=0; i _matModel; - set => _matModel = value; - } - - public Matrix4x4 ViewMatrix - { - get => _matView; - set => _matView = value; - } - - public Matrix4x4 ProjectionMatrix - { - get => _matProjection; - set => _matProjection = value; - } - - Color[] frame_buf; - float[] depth_buf; - Color[] temp_buf; - - Color[] samplers_color_MSAA; - bool[] samplers_mask_MSAA; - float[] samplers_depth_MSAA; + Matrix4x4 _matProjection; RenderTexture _colorTexture; - - public FragmentShader CurrentFragmentShader {get; set;} + RenderTexture _depthTexture; //Stats int _trianglesAll, _trianglesRendered; @@ -51,31 +24,38 @@ namespace URasterizer public OnRasterizerStatUpdate StatDelegate; - //浼樺寲GC - Vector4[] _tmpVector4s = new Vector4[3]; - Vector3[] _tmpVector3s = new Vector3[3]; - //Compute shader ComputeShader computeShader; int kernelClearFrame; int kernelVertexProcess; - int kernelTriangleSetup; - int kernelRasterizeTriangle; + int kernelTriangleProcess; - //ids of compute shader variables - int frameColorTextureId; - + //ids of compute shader variables int vertexBufferId; int normalBufferId; - int vertexOutBufferId; + int uvBufferId; int triangleBufferId; - int renderTriangleBufferId; + int vertexOutBufferId; + int frameColorTextureId; + int frameDepthTextureId; + + int clearColorId; int matMVPId; int matModelId; + int frameBufferSizeId; + + int worldSpaceCameraPosId; + int worldSpaceLightDirId; + int lightColorId; + int ambientColorId; - public String Name { get=>"GPU"; } + int meshTextureId; - public Texture ColorTexture { get=>_colorTexture; } + public String Name { get=>"GPU Driven"; } + + public Texture ColorTexture { + get => _colorTexture; + } public GPURasterizer(int w, int h, RenderingConfig config) @@ -87,32 +67,41 @@ namespace URasterizer _width = w; _height = h; - frame_buf = new Color[w * h]; - depth_buf = new float[w * h]; - temp_buf = new Color[w * h]; - _colorTexture = new RenderTexture(w, h, 0); _colorTexture.enableRandomWrite = true; _colorTexture.Create(); _colorTexture.filterMode = FilterMode.Point; + _depthTexture = new RenderTexture(w, h, 0, RenderTextureFormat.RFloat); + _depthTexture.enableRandomWrite = true; + _depthTexture.Create(); + _depthTexture.filterMode = FilterMode.Point; + //init for compute shader computeShader = config.ComputeShader; kernelClearFrame = computeShader.FindKernel("ClearFrame"); kernelVertexProcess = computeShader.FindKernel("VertexProcess"); - kernelTriangleSetup = computeShader.FindKernel("TriangleSetup"); - kernelRasterizeTriangle = computeShader.FindKernel("RasterizeTriangle"); - - frameColorTextureId = Shader.PropertyToID("frameColorTexture"); + kernelTriangleProcess = computeShader.FindKernel("TriangleProcess"); + vertexBufferId = Shader.PropertyToID("vertexBuffer"); normalBufferId = Shader.PropertyToID("normalBuffer"); + uvBufferId = Shader.PropertyToID("uvBuffer"); + triangleBufferId = Shader.PropertyToID("triangleBuffer"); vertexOutBufferId = Shader.PropertyToID("vertexOutBuffer"); - triangleBufferId = Shader.PropertyToID("triangleBuffer"); - renderTriangleBufferId = Shader.PropertyToID("renderTriangleBuffer"); + frameColorTextureId = Shader.PropertyToID("frameColorTexture"); + frameDepthTextureId = Shader.PropertyToID("frameDepthTexture"); + clearColorId = Shader.PropertyToID("clearColor"); matMVPId = Shader.PropertyToID("matMVP"); matModelId = Shader.PropertyToID("matModel"); + frameBufferSizeId = Shader.PropertyToID("frameBufferSize"); + + worldSpaceCameraPosId = Shader.PropertyToID("worldSpaceCameraPos"); + worldSpaceLightDirId = Shader.PropertyToID("worldSpaceLightDir"); + lightColorId = Shader.PropertyToID("lightColor"); + ambientColorId = Shader.PropertyToID("ambientColor"); + meshTextureId = Shader.PropertyToID("meshTexture"); } @@ -126,65 +115,59 @@ namespace URasterizer public void Clear(BufferMask mask) { - ProfileManager.BeginSample("Rasterizer.Clear GPU"); + ProfileManager.BeginSample("GPURasterizer.Clear"); var shader = _config.ComputeShader; shader.SetTexture(kernelClearFrame, frameColorTextureId, _colorTexture); + shader.SetTexture(kernelClearFrame, frameDepthTextureId, _depthTexture); var clearColor = _config.ClearColor; - shader.SetFloats("ClearColor", clearColor.r, clearColor.g, clearColor.b, clearColor.a); + shader.SetFloats(clearColorId, clearColor.r, clearColor.g, clearColor.b, clearColor.a); int groupX = Mathf.CeilToInt(_colorTexture.width/32f); - int groupY = Mathf.CeilToInt(_colorTexture.height/24f); - groupX = groupX==0? 1 : groupX; - groupY = groupY==0? 1 : groupY; + int groupY = Mathf.CeilToInt(_colorTexture.height/24f); shader.Dispatch(kernelClearFrame, groupX, groupY, 1); _trianglesAll = _trianglesRendered = 0; _verticesAll = 0; ProfileManager.EndSample(); - } + } - public void SetupViewProjectionMatrix(Camera camera) + public void SetupUniforms(Camera camera, Light mainLight) { - //宸︽墜鍧愭爣绯昏浆鍙虫墜鍧愭爣绯,浠ヤ笅鍧愭爣鍜屽悜閲弞鍙栧弽 + var shader = _config.ComputeShader; + var camPos = camera.transform.position; - camPos.z *= -1; - var lookAt = camera.transform.forward; - lookAt.z *= -1; - var up = camera.transform.up; - up.z *= -1; + camPos.z *= -1; + shader.SetFloats(worldSpaceCameraPosId, camPos.x, camPos.y, camPos.z); + + var lightDir = mainLight.transform.forward; + lightDir.z *= -1; + shader.SetFloats(worldSpaceLightDirId, -lightDir.x, -lightDir.y, -lightDir.z); + + var lightColor = mainLight.color * mainLight.intensity; + shader.SetFloats(lightColorId, lightColor.r, lightColor.g, lightColor.b, lightColor.a); - ViewMatrix = TransformTool.GetViewMatrix(camPos, lookAt, up); + shader.SetFloats(ambientColorId, _config.AmbientColor.r, _config.AmbientColor.g, _config.AmbientColor.b, _config.AmbientColor.a); + - if (camera.orthographic) - { - float halfOrthHeight = camera.orthographicSize; - float halfOrthWidth = halfOrthHeight * Aspect; - float f = -camera.farClipPlane; - float n = -camera.nearClipPlane; - ProjectionMatrix = TransformTool.GetOrthographicProjectionMatrix(-halfOrthWidth, halfOrthWidth, -halfOrthHeight, halfOrthHeight, f, n); - } - else - { - ProjectionMatrix = TransformTool.GetPerspectiveProjectionMatrix(camera.fieldOfView, Aspect, camera.nearClipPlane, camera.farClipPlane); - } + TransformTool.SetupViewProjectionMatrix(camera, Aspect, out _matView, out _matProjection); } - public void Draw(RenderingObject ro, Camera camera) + public void DrawObject(RenderingObject ro) { - ProfileManager.BeginSample("Rasterizer.Draw"); - - Mesh mesh = ro.mesh; + ProfileManager.BeginSample("GPURasterizer.Draw"); - SetupViewProjectionMatrix(camera); + Mesh mesh = ro.mesh; - ModelMatrix = ro.GetModelMatrix(); + _matModel = ro.GetModelMatrix(); Matrix4x4 mvp = _matProjection * _matView * _matModel; Matrix4x4 normalMat = _matModel.inverse.transpose; + int triangleCount = ro.MeshTriangles.Length / 3; + _verticesAll += mesh.vertexCount; - _trianglesAll += ro.MeshTriangles.Length / 3; + _trianglesAll += triangleCount; ProfileManager.BeginSample("GPURasterizer.VertexProcess"); @@ -193,267 +176,36 @@ namespace URasterizer shader.SetMatrix(matModelId, _matModel); shader.SetBuffer(kernelVertexProcess, vertexBufferId, ro.VertexBuffer); shader.SetBuffer(kernelVertexProcess, normalBufferId, ro.NormalBuffer); + shader.SetBuffer(kernelVertexProcess, uvBufferId, ro.UVBuffer); shader.SetBuffer(kernelVertexProcess, vertexOutBufferId, ro.VertexOutBuffer); - int groupCnt = Mathf.CeilToInt(mesh.vertexCount/768f); - groupCnt = groupCnt==0? 1: groupCnt; + int groupCnt = Mathf.CeilToInt(mesh.vertexCount/512f); shader.Dispatch(kernelVertexProcess, groupCnt, 1, 1); ProfileManager.EndSample(); - ProfileManager.BeginSample("GPURasterizer.TriangleSetup"); - - shader.SetInts("FrameBufferSize", _colorTexture.width, _colorTexture.height); - ro.RenderTriangleBuffer.SetCounterValue(0); - shader.SetBuffer(kernelTriangleSetup, triangleBufferId, ro.TriangleBuffer); - shader.SetBuffer(kernelTriangleSetup, renderTriangleBufferId, ro.RenderTriangleBuffer); - shader.SetBuffer(kernelTriangleSetup, vertexOutBufferId, ro.VertexOutBuffer); + ProfileManager.BeginSample("GPURasterizer.TriangleProcess"); - groupCnt = Mathf.CeilToInt((ro.MeshTriangles.Length/3)/768f); - groupCnt = groupCnt==0? 1: groupCnt; - shader.Dispatch(kernelTriangleSetup, groupCnt, 1, 1); - - ComputeBuffer tmpBuf = new ComputeBuffer(1, sizeof(uint), ComputeBufferType.IndirectArguments); + shader.SetInts(frameBufferSizeId, _colorTexture.width, _colorTexture.height); + shader.SetBuffer(kernelTriangleProcess, triangleBufferId, ro.TriangleBuffer); + shader.SetBuffer(kernelTriangleProcess, vertexOutBufferId, ro.VertexOutBuffer); + shader.SetTexture(kernelTriangleProcess, frameColorTextureId, _colorTexture); + shader.SetTexture(kernelTriangleProcess, frameDepthTextureId, _depthTexture); + shader.SetTexture(kernelTriangleProcess, meshTextureId, ro.texture); - ComputeBuffer.CopyCount(ro.RenderTriangleBuffer, tmpBuf, 0); - uint[] tmpData = new uint[1]; - tmpBuf.GetData(tmpData); - _trianglesRendered = (int)tmpData[0]; - tmpBuf.Release(); + groupCnt = Mathf.CeilToInt(triangleCount/512f); + shader.Dispatch(kernelTriangleProcess, groupCnt, 1, 1); - ProfileManager.EndSample(); - - //瀵规瘡涓猼riangle杩涜鍏夋爡鍖 - for(int i=0; i < _trianglesRendered; ++i){ - shader.SetBuffer(kernelRasterizeTriangle, "renderCosumeBuffer", ro.RenderTriangleBuffer); - shader.SetBuffer(kernelRasterizeTriangle, vertexOutBufferId, ro.VertexOutBuffer); - shader.SetTexture(kernelRasterizeTriangle, frameColorTextureId, _colorTexture); - - int groupX = Mathf.CeilToInt(_colorTexture.width/32f); - int groupY = Mathf.CeilToInt(_colorTexture.height/24f); - groupX = groupX==0? 1 : groupX; - groupY = groupY==0? 1 : groupY; - shader.Dispatch(kernelRasterizeTriangle, groupX, groupY, 1); - } - - - - - - - - //Resolve AA - if(_config.MSAA != MSAALevel.Disabled && !_config.WireframeMode) - { - int MSAALevel = (int)_config.MSAA; - int SamplersPerPixel = MSAALevel * MSAALevel; - - // for (int y=0; y < _height; ++y) - // { - // for(int x=0; x < _width; ++x) - // { - // int index = GetIndex(x, y); - // Color color = Color.clear; - // float a = 0.0f; - // for(int si=0; si < MSAALevel; ++si) - // { - // for(int sj=0; sj < MSAALevel; ++sj) - // { - // int xi = x * MSAALevel + si; - // int yi = y * MSAALevel + sj; - // int indexSamper = yi * _width * MSAALevel + xi; - // if (samplers_mask_MSAA[indexSamper]) - // { - // color += samplers_color_MSAA[indexSamper]; - // a += 1.0f; - // } - // } - // } - // if(a > 0.0f) - // { - // frame_buf[index] = color / SamplersPerPixel; - // } - // } - // } - } - - ProfileManager.EndSample(); - } - - - - - - - //Screen space rasterization - void RasterizeTriangle(Triangle t, RenderingObject ro) - { - ProfileManager.BeginSample("Rasterizer.RasterizeTriangle"); - var v = _tmpVector4s; - v[0] = t.Vertex0.Position; - v[1] = t.Vertex1.Position; - v[2] = t.Vertex2.Position; - - //Find out the bounding box of current triangle. - float minX = v[0].x; - float maxX = minX; - float minY = v[0].y; - float maxY = minY; - - for(int i=1; i<3; ++i) - { - float x = v[i].x; - if(x < minX) - { - minX = x; - } else if(x > maxX) - { - maxX = x; - } - float y = v[i].y; - if(y < minY) - { - minY = y; - }else if(y > maxY) - { - maxY = y; - } - } - - int minPX = Mathf.FloorToInt(minX); - minPX = minPX < 0 ? 0 : minPX; - int maxPX = Mathf.CeilToInt(maxX); - maxPX = maxPX > _width ? _width : maxPX; - int minPY = Mathf.FloorToInt(minY); - minPY = minPY < 0 ? 0 : minPY; - int maxPY = Mathf.CeilToInt(maxY); - maxPY = maxPY > _height ? _height : maxPY; - - if(_config.MSAA == MSAALevel.Disabled) - { - // 閬嶅巻褰撳墠涓夎褰㈠寘鍥翠腑鐨勬墍鏈夊儚绱狅紝鍒ゆ柇褰撳墠鍍忕礌鏄惁鍦ㄤ笁瑙掑舰涓 - // 瀵逛簬鍦ㄤ笁瑙掑舰涓殑鍍忕礌锛屼娇鐢ㄩ噸蹇冨潗鏍囨彃鍊煎緱鍒版繁搴﹀硷紝骞朵娇鐢▃ buffer杩涜娣卞害娴嬭瘯鍜屽啓鍏 - for(int y = minPY; y < maxPY; ++y) - { - for(int x = minPX; x < maxPX; ++x) - { - //if(IsInsideTriangle(x, y, t)) //-->妫娴嬫槸鍚﹀湪涓夎褰㈠唴姣斾娇鐢ㄩ噸蹇冨潗鏍囨娴嬭鎱紝鍥犳鍏堣绠楅噸蹇冨潗鏍囷紝鍐嶆鏌3涓潗鏍囨槸鍚︽湁灏忎簬0 - { - //璁$畻閲嶅績鍧愭爣 - var c = ComputeBarycentric2D(x, y, t); - float alpha = c.x; - float beta = c.y; - float gamma = c.z; - if(alpha < 0 || beta < 0 || gamma < 0){ - continue; - } - //閫忚鏍℃鎻掑硷紝z涓洪忚鏍℃鎻掑煎悗鐨剉iew space z鍊 - float z = 1.0f / (alpha / v[0].w + beta / v[1].w + gamma / v[2].w); - //zp涓洪忚鏍℃鎻掑煎悗鐨剆creen space z鍊 - float zp = (alpha * v[0].z / v[0].w + beta * v[1].z / v[1].w + gamma * v[2].z / v[2].w) * z; + ProfileManager.EndSample(); - //娣卞害娴嬭瘯(娉ㄦ剰鎴戜滑杩欏効鐨剒鍊艰秺澶ц秺闈犺繎near plane锛屽洜姝ゅぇ鍊奸氳繃娴嬭瘯锛 - int index = GetIndex(x, y); - if(zp >= depth_buf[index]) - { - depth_buf[index] = zp; - - //閫忚鏍℃鎻掑 - ProfileManager.BeginSample("Rasterizer.RasterizeTriangle.AttributeInterpolation"); - Color color_p = (alpha * t.Vertex0.Color / v[0].w + beta * t.Vertex1.Color / v[1].w + gamma * t.Vertex2.Color / v[2].w) * z; - Vector2 uv_p = (alpha * t.Vertex0.Texcoord / v[0].w + beta * t.Vertex1.Texcoord / v[1].w + gamma * t.Vertex2.Texcoord / v[2].w) * z; - Vector3 normal_p = (alpha * t.Vertex0.Normal / v[0].w + beta * t.Vertex1.Normal / v[1].w + gamma * t.Vertex2.Normal / v[2].w) * z; - Vector3 worldPos_p = (alpha * t.Vertex0.WorldPos / v[0].w + beta * t.Vertex1.WorldPos / v[1].w + gamma * t.Vertex2.WorldPos / v[2].w) * z; - Vector3 worldNormal_p = (alpha * t.Vertex0.WorldNormal / v[0].w + beta * t.Vertex1.WorldNormal / v[1].w + gamma * t.Vertex2.WorldNormal / v[2].w) * z; - ProfileManager.EndSample(); - - if (CurrentFragmentShader != null) - { - FragmentShaderInputData input = new FragmentShaderInputData(); - input.Color = color_p; - input.UV = uv_p; - input.Texture = ro.texture; - input.LocalNormal = normal_p; - input.WorldPos = worldPos_p; - input.WorldNormal = worldNormal_p; - - ProfileManager.BeginSample("Rasterizer.RasterizeTriangle.FragmentShader"); - frame_buf[index] = CurrentFragmentShader(input); - ProfileManager.EndSample(); - } - - - - } - } - } - } - } - - ProfileManager.EndSample(); - } - - - - Vector3 ComputeBarycentric2D(float x, float y, Triangle t) - { - ProfileManager.BeginSample("Rasterizer.ComputeBarycentric2D"); - var v = _tmpVector4s; - v[0] = t.Vertex0.Position; - v[1] = t.Vertex1.Position; - v[2] = t.Vertex2.Position; - - float c1 = (x * (v[1].y - v[2].y) + (v[2].x - v[1].x) * y + v[1].x * v[2].y - v[2].x * v[1].y) / (v[0].x * (v[1].y - v[2].y) + (v[2].x - v[1].x) * v[0].y + v[1].x * v[2].y - v[2].x * v[1].y); - float c2 = (x * (v[2].y - v[0].y) + (v[0].x - v[2].x) * y + v[2].x * v[0].y - v[0].x * v[2].y) / (v[1].x * (v[2].y - v[0].y) + (v[0].x - v[2].x) * v[1].y + v[2].x * v[0].y - v[0].x * v[2].y); - float c3 = (x * (v[0].y - v[1].y) + (v[1].x - v[0].x) * y + v[0].x * v[1].y - v[1].x * v[0].y) / (v[2].x * (v[0].y - v[1].y) + (v[1].x - v[0].x) * v[2].y + v[0].x * v[1].y - v[1].x * v[0].y); - - ProfileManager.EndSample(); - return new Vector3(c1, c2, c3); - } - - public int GetIndex(int x, int y) - { - return y * _width + x; - } - - + } public void UpdateFrame() - { - ProfileManager.BeginSample("CameraRenderer.UpdateFrame"); - - // switch (_config.DisplayBuffer) - // { - // case DisplayBufferType.Color: - // texture.SetPixels(frame_buf); - // break; - // case DisplayBufferType.DepthRed: - // case DisplayBufferType.DepthGray: - // for (int i = 0; i < depth_buf.Length; ++i) - // { - // //depth_buf涓殑鍊艰寖鍥存槸[0,1]锛屼笖鏈杩戝涓1锛屾渶杩滃涓0銆傚洜姝ゅ彲瑙嗗寲鍚庤儗鏅槸榛戣壊 - // float c = depth_buf[i]; - // if(_config.DisplayBuffer == DisplayBufferType.DepthRed) - // { - // temp_buf[i] = new Color(c, 0, 0); - // } - // else - // { - // temp_buf[i] = new Color(c, c, c); - // } - // } - // texture.SetPixels(temp_buf); - // break; - // } - - // texture.Apply(); - + { if (StatDelegate != null) { StatDelegate(_verticesAll, _trianglesAll, _trianglesRendered); - } - - ProfileManager.EndSample(); + } } diff --git a/URasterizer/Assets/URasterizer/Codes/IRasterizer.cs b/URasterizer/Assets/URasterizer/Codes/IRasterizer.cs index ce494cf8209690fa9d4a0dddf8ec40ac3748c369..2eb8851de428d680e3030de16585344d2911ddff 100644 --- a/URasterizer/Assets/URasterizer/Codes/IRasterizer.cs +++ b/URasterizer/Assets/URasterizer/Codes/IRasterizer.cs @@ -6,12 +6,13 @@ namespace URasterizer { string Name { get; } void Clear(BufferMask mask); - void Draw(RenderingObject ro, Camera camera); - Texture ColorTexture { get; } + void SetupUniforms(Camera camera, Light mainLight); + + void DrawObject(RenderingObject ro); - void UpdateFrame(); + Texture ColorTexture { get; } - FragmentShader CurrentFragmentShader { get; set; } + void UpdateFrame(); } } \ No newline at end of file diff --git a/URasterizer/Assets/URasterizer/Codes/RenderingConfig.cs b/URasterizer/Assets/URasterizer/Codes/RenderingConfig.cs index e9981f34bed1e1210624206de83cec911f9e7b97..b2f538f93f7bee40a665778bad1a4b8fc02921f1 100644 --- a/URasterizer/Assets/URasterizer/Codes/RenderingConfig.cs +++ b/URasterizer/Assets/URasterizer/Codes/RenderingConfig.cs @@ -6,23 +6,24 @@ namespace URasterizer { [CreateAssetMenu(menuName = "URasterizer/RenderingConfig")] public class RenderingConfig : ScriptableObject { + [Header("Common Setting")] + public bool EnableRendering = true; public Color ClearColor = Color.black; + public Color AmbientColor = Color.black; + public RasterizerType RasterizerType; + + [Header("CPU Rasterizer ONLY Setting")] public bool WireframeMode = false; public bool BackfaceCulling = true; public DisplayBufferType DisplayBuffer = DisplayBufferType.Color; public MSAALevel MSAA = MSAALevel.Disabled; public bool BilinearSample = true; public ShaderType FragmentShaderType = ShaderType.BlinnPhong; - public Color AmbientColor = Color.black; - - [Header("Vertex Color Setting")] + public VertexColors VertexColors; - [Header("GPU Driven")] - public ComputeShader ComputeShader; - - [Header("Current Rasterizer")] - public RasterizerType RasterizerType; + [Header("GPU Driven Setting")] + public ComputeShader ComputeShader; } public enum DisplayBufferType diff --git a/URasterizer/Assets/URasterizer/Codes/RenderingObject.cs b/URasterizer/Assets/URasterizer/Codes/RenderingObject.cs index cd730b585882babd84ddd5fcc70860ff1a75b27c..0fa87a79c10a40441bf83629f6541b568a7a1da1 100644 --- a/URasterizer/Assets/URasterizer/Codes/RenderingObject.cs +++ b/URasterizer/Assets/URasterizer/Codes/RenderingObject.cs @@ -10,6 +10,7 @@ namespace URasterizer [HideInInspector, System.NonSerialized] public Texture2D texture; +#region CPU Rasterizer Use //缂撳瓨閬垮厤鍦╠raw loop涓粠mesh copy [HideInInspector, System.NonSerialized] public Vector3[] MeshVertices; @@ -21,14 +22,17 @@ namespace URasterizer public Vector2[] MeshUVs; [HideInInspector, System.NonSerialized] public VSOutBuf[] vsOutputBuffer; +#endregion +#region GPU Rasterizer Use public ComputeBuffer VertexBuffer; public ComputeBuffer NormalBuffer; + public ComputeBuffer UVBuffer; public ComputeBuffer TriangleBuffer; - public ComputeBuffer VertexOutBuffer; + public ComputeBuffer VertexOutBuffer; //for vertex shader output public ComputeBuffer RenderTriangleBuffer; - +#endregion private void Start() { @@ -43,7 +47,11 @@ namespace URasterizer { texture = meshRenderer.sharedMaterial.mainTexture as Texture2D; } + if(texture==null){ + texture = Texture2D.whiteTexture; + } + //CPU Rasterizer浣跨敤鐨勬ā鍨嬫暟鎹紦瀛 MeshVertices = mesh.vertices; MeshNormals = mesh.normals; MeshTriangles = mesh.triangles; @@ -57,23 +65,25 @@ namespace URasterizer NormalBuffer = new ComputeBuffer(vertexCnt, 3*sizeof(float)); NormalBuffer.SetData(MeshNormals); + UVBuffer = new ComputeBuffer(vertexCnt, 2*sizeof(float)); + UVBuffer.SetData(MeshUVs); + //鍒濆鍖栦笁瑙掑舰鏁扮粍锛屾瘡涓笁瑙掑舰鍖呭惈3涓储寮曞 //娉ㄦ剰杩欏効瀵硅皟浜唙0鍜寁1鐨勭储寮曪紝鍥犱负鍘熸潵鐨 0,1,2鏄『鏃堕拡鐨勶紝瀵硅皟鍚庢槸 1,0,2鏄嗘椂閽堢殑 //Unity Quard妯″瀷鐨勪袱涓笁瑙掑舰绱㈠紩鍒嗗埆鏄 0,3,1,3,0,2 杞崲鍚庝负 3,0,1,0,3,2 - int idxCnt = MeshTriangles.Length; - Vector3Int[] triangles = new Vector3Int[idxCnt/3]; - for(int i=0; i < triangles.Length; ++i){ - triangles[i].x = MeshTriangles[i*3+1]; - triangles[i].y = MeshTriangles[i*3]; - triangles[i].z = MeshTriangles[i*3+2]; + int triCnt = MeshTriangles.Length/3; + Vector3Int[] triangles = new Vector3Int[triCnt]; + for(int i=0; i < triCnt; ++i){ + int j = i * 3; + triangles[i].x = MeshTriangles[j+1]; + triangles[i].y = MeshTriangles[j]; + triangles[i].z = MeshTriangles[j+2]; } TriangleBuffer = new ComputeBuffer(triangles.Length, 3*sizeof(uint)); TriangleBuffer.SetData(triangles); - VertexOutBuffer = new ComputeBuffer(vertexCnt, 13*sizeof(float)); - - RenderTriangleBuffer = new ComputeBuffer(MeshTriangles.Length/3, sizeof(uint)*3, ComputeBufferType.Append); + VertexOutBuffer = new ComputeBuffer(vertexCnt, 15*sizeof(float)); } void OnDestroy() @@ -82,12 +92,12 @@ namespace URasterizer VertexBuffer = null; NormalBuffer.Release(); NormalBuffer = null; - VertexOutBuffer.Release(); - VertexOutBuffer = null; + UVBuffer.Release(); + UVBuffer = null; TriangleBuffer.Release(); TriangleBuffer = null; - RenderTriangleBuffer.Release(); - RenderTriangleBuffer = null; + VertexOutBuffer.Release(); + VertexOutBuffer = null; } diff --git a/URasterizer/Assets/URasterizer/Codes/TransformTool.cs b/URasterizer/Assets/URasterizer/Codes/TransformTool.cs index 47711dae36da373964544760bfe5d7bc2356643b..9376bc31d397847943786e618b1ce2436677166f 100644 --- a/URasterizer/Assets/URasterizer/Codes/TransformTool.cs +++ b/URasterizer/Assets/URasterizer/Codes/TransformTool.cs @@ -144,6 +144,32 @@ namespace URasterizer float f = -zFar; return GetPerspectiveProjectionMatrix(l, r, b, t, f, n); } + + public static void SetupViewProjectionMatrix(Camera camera, float aspect, out Matrix4x4 ViewMatrix, out Matrix4x4 ProjectionMatrix) + { + //左手坐标系转右手坐标系,以下坐标和向量z取反 + var camPos = camera.transform.position; + camPos.z *= -1; + var lookAt = camera.transform.forward; + lookAt.z *= -1; + var up = camera.transform.up; + up.z *= -1; + + ViewMatrix = TransformTool.GetViewMatrix(camPos, lookAt, up); + + if (camera.orthographic) + { + float halfOrthHeight = camera.orthographicSize; + float halfOrthWidth = halfOrthHeight * aspect; + float f = -camera.farClipPlane; + float n = -camera.nearClipPlane; + ProjectionMatrix = GetOrthographicProjectionMatrix(-halfOrthWidth, halfOrthWidth, -halfOrthHeight, halfOrthHeight, f, n); + } + else + { + ProjectionMatrix = GetPerspectiveProjectionMatrix(camera.fieldOfView, aspect, camera.nearClipPlane, camera.farClipPlane); + } + } } } \ No newline at end of file diff --git a/URasterizer/Assets/URasterizer/DefaultAssets/ControlRoot.prefab b/URasterizer/Assets/URasterizer/DefaultAssets/ControlRoot.prefab index ffb61282acdc9cac14067f7709bc73cced30704e..d7baafb9c36d593e1efee48bb3a611f678d510d8 100644 --- a/URasterizer/Assets/URasterizer/DefaultAssets/ControlRoot.prefab +++ b/URasterizer/Assets/URasterizer/DefaultAssets/ControlRoot.prefab @@ -138,7 +138,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.36073107, g: 0, b: 0.98039216, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 diff --git a/URasterizer/Assets/URasterizer/DefaultAssets/URComputeShader.compute b/URasterizer/Assets/URasterizer/DefaultAssets/URComputeShader.compute deleted file mode 100644 index c465bf5e553405ff353b8c3b3f8ef37ed7f0b4d8..0000000000000000000000000000000000000000 --- a/URasterizer/Assets/URasterizer/DefaultAssets/URComputeShader.compute +++ /dev/null @@ -1,354 +0,0 @@ - -#pragma kernel VertexProcess -#pragma kernel ClearFrame -#pragma kernel TriangleSetup -#pragma kernel RasterizeTriangle - -struct VertexOutBuf -{ - float4 clipPos; - float3 worldPos; - float3 objectNormal; - float3 worldNormal; -}; - -float4 ClearColor; -uint2 FrameBufferSize; - -float4x4 matMVP; -float4x4 matModel; - -uint currentRenderTriangle; - - -StructuredBuffer vertexBuffer; -StructuredBuffer normalBuffer; -RWStructuredBuffer vertexOutBuffer; - -StructuredBuffer triangleBuffer; // All triangles of the mesh -AppendStructuredBuffer renderTriangleBuffer; //triangles to render - -ConsumeStructuredBuffer renderCosumeBuffer; - -RWTexture2D frameColorTexture; - - -[numthreads(32,24,1)] -void ClearFrame(uint3 id : SV_DispatchThreadID) -{ - frameColorTexture[id.xy] = ClearColor; -} - -[numthreads(768,1,1)] -void VertexProcess (uint3 id : SV_DispatchThreadID) -{ - float4 pos = float4(vertexBuffer[id.x].x, vertexBuffer[id.x].y, -vertexBuffer[id.x].z, 1.0f); - float3 normal = float3(normalBuffer[id.x].x, normalBuffer[id.x].y, -normalBuffer[id.x].z); - vertexOutBuffer[id.x].clipPos = mul(matMVP, pos); - vertexOutBuffer[id.x].worldPos = mul(matModel, pos).xyz; - vertexOutBuffer[id.x].objectNormal = normal; - vertexOutBuffer[id.x].worldNormal = mul( (float3x3)matModel , normal); -} - -bool Clipped(float4 v[3]) -{ - //Clip space浣跨敤GAMES101瑙勮寖锛屽彸鎵嬪潗鏍囩郴锛宯涓+1锛 f涓-1 - //瑁佸壀锛堜粎鏁翠綋鍓旈櫎锛 - for (int i = 0; i < 3; ++i) - { - float4 vertex = v[i]; - float w = vertex.w; - w = w >= 0 ? w : -w; //鐢变簬NDC涓绘槸婊¤冻-1<=Zndc<=1, 鑰屽綋 w < 0 鏃讹紝-w >= Zclip = Zndc*w >= w銆傛墍浠ユ鏃禼lip space鐨勫潗鏍囪寖鍥存槸[w,-w], 涓轰簡姣旇緝鏃舵洿鏄庣‘锛屽皢w鍙栨 - - bool inside = (vertex.x <= w && vertex.x >= -w - && vertex.y <= w && vertex.y >= -w - && vertex.z <= w && vertex.z >= -w); - if (inside) - { - //涓嶈鍓笁瑙掑舰锛屽彧瑕佹湁浠绘剰涓鐐瑰湪clip space涓垯涓夎褰㈡暣浣撲繚鐣 - return false; - } - } - - //涓変釜椤剁偣閮戒笉鍦ㄤ笁瑙掑舰涓垯鍓旈櫎 - return true; -} - -[numthreads(768,1,1)] -void TriangleSetup(uint3 id : SV_DispatchThreadID) -{ - uint3 tri = triangleBuffer[id.x]; - int idx0 = tri.x; - int idx1 = tri.y; - int idx2 = tri.z; - - float4 v[3]; - v[0] = vertexOutBuffer[idx0].clipPos; - v[1] = vertexOutBuffer[idx1].clipPos; - v[2] = vertexOutBuffer[idx2].clipPos; - - if(Clipped(v)){ - return; - } - - //Perspective division, clip space to NDC - for (int k=0; k<3; k++) - { - v[k].x /= v[k].w; - v[k].y /= v[k].w; - v[k].z /= v[k].w; - } - - //backface culling - float3 e01 = v[1].xyz - v[0].xyz; - float3 e02 = v[2].xyz - v[0].xyz; - float3 crossv = cross(e01, e02); - if (crossv.z < 0) - { - return; - } - - //Viewport Transform锛 NDC to screen space - for (k = 0; k < 3; k++) - { - float4 vec = v[k]; - vec.x = 0.5f * FrameBufferSize.x * (vec.x + 1.0f); - vec.y = 0.5f * FrameBufferSize.y * (vec.y + 1.0f); - - //鍦ㄧ‖浠舵覆鏌撲腑锛孨DC鐨剒鍊肩粡杩囩‖浠剁殑閫忚闄ゆ硶涔嬪悗灏辩洿鎺ュ啓鍏ュ埌depth buffer浜嗭紝濡傛灉瑕佽皟鏁撮渶瑕佸湪鎶曞奖鐭╅樀涓皟鏁 - //鐢变簬鎴戜滑鏄蒋浠舵覆鏌擄紝鎵浠ュ彲浠ュ湪杩欓噷璋冩暣z鍊笺 - - //GAMES101绾﹀畾鐨凬DC鏄彸鎵嬪潗鏍囩郴锛寊鍊艰寖鍥存槸[-1,1]锛屼絾n涓1锛宖涓-1锛屽洜姝ゅ艰秺澶ц秺闈犺繎n銆 - //涓轰簡鍙鍖朌epth buffer锛屽皢鏈缁堢殑z鍊间粠[-1,1]鏄犲皠鍒癧0,1]鐨勮寖鍥达紝鍥犳鏈缁坣涓1, f涓0銆傜n瓒婅繎锛屾繁搴﹀艰秺澶с - //鐢变簬杩滃鐨剒鍊间负0锛屽洜姝lear鏃舵繁搴﹁娓呴櫎涓0锛岀劧鍚庢繁搴︽祴璇曟椂锛屼娇鐢℅REATER娴嬭瘯銆 - //(褰撶劧鎴戜滑涔熷彲浠ュ湪杩欏効鍙嶈浆z鍊硷紝鐒跺悗clear鏃朵娇鐢╢loat.MaxValue娓呴櫎锛屽苟涓旀繁搴︽祴璇曟椂浣跨敤LESS_EQUAL娴嬭瘯) - //娉ㄦ剰锛氳繖鍎跨殑z鍊艰皟鏁村苟涓嶆槸蹇呰鐨勶紝鍙槸涓轰簡鍙鍖栨椂渚夸簬鏄犲皠涓洪鑹插笺傚叾瀹炰篃鍙互鍦ㄥ彲瑙嗗寲鐨勫湴鏂硅皟鏁淬 - //浣嗘槸杩欎箞璋冩暣鍚庯紝姝eソ鍜孶nity鍦―irectX骞冲彴鐨凴everse z涓鏍凤紝璁﹏ear plane闄勮繎鐨剒鍊肩殑娴偣鏁扮簿搴︽彁楂樸 - vec.z = vec.z * 0.5f + 0.5f; - - v[k] = vec; - } - - //Screen space coordinates saved in clip pos - vertexOutBuffer[idx0].clipPos = v[0]; - vertexOutBuffer[idx1].clipPos = v[1]; - vertexOutBuffer[idx2].clipPos = v[2]; - - //triangle actually rendering append to this buffer - renderTriangleBuffer.Append(uint3(idx0, idx1, idx2)); -} - -float3 ComputeBarycentric2D(float x, float y, float4 v[3]) -{ - float c1 = (x * (v[1].y - v[2].y) + (v[2].x - v[1].x) * y + v[1].x * v[2].y - v[2].x * v[1].y) / (v[0].x * (v[1].y - v[2].y) + (v[2].x - v[1].x) * v[0].y + v[1].x * v[2].y - v[2].x * v[1].y); - float c2 = (x * (v[2].y - v[0].y) + (v[0].x - v[2].x) * y + v[2].x * v[0].y - v[0].x * v[2].y) / (v[1].x * (v[2].y - v[0].y) + (v[0].x - v[2].x) * v[1].y + v[2].x * v[0].y - v[0].x * v[2].y); - float c3 = (x * (v[0].y - v[1].y) + (v[1].x - v[0].x) * y + v[0].x * v[1].y - v[1].x * v[0].y) / (v[2].x * (v[0].y - v[1].y) + (v[1].x - v[0].x) * v[2].y + v[0].x * v[1].y - v[1].x * v[0].y); - return float3(c1, c2, c3); -} - -[numthreads(32,24,1)] -void RasterizeTriangle(uint3 id : SV_DispatchThreadID) -{ - uint3 tri = renderCosumeBuffer.Consume();// triangleBuffer[currentRenderTriangle]; //triangleBuffer - int idx0 = tri.x; - int idx1 = tri.y; - int idx2 = tri.z; - float4 v[3]; - v[0] = vertexOutBuffer[idx0].clipPos; - v[1] = vertexOutBuffer[idx1].clipPos; - v[2] = vertexOutBuffer[idx2].clipPos; - - //杩欎釜鍑芥暟锛屾瘡涓儚绱犻兘浼氭墽琛岋紝鏈濂界敤涓涓猙uffer瀛樻墍鏈夌殑闇瑕佹覆鏌撶殑涓夎褰㈢殑AABB锛岄伩鍏嶆瘡娆¢兘鍦ㄨ繖鍎胯绠 - //Find out the bounding box of current triangle. - float minX = v[0].x; - float maxX = minX; - float minY = v[0].y; - float maxY = minY; - - for(int i=1; i<3; ++i) - { - float x = v[i].x; - if(x < minX) - { - minX = x; - } else if(x > maxX) - { - maxX = x; - } - float y = v[i].y; - if(y < minY) - { - minY = y; - }else if(y > maxY) - { - maxY = y; - } - } - - int minPX = floor(minX); - minPX = minPX < 0 ? 0 : minPX; - int maxPX = ceil(maxX); - maxPX = maxPX > FrameBufferSize.x ? FrameBufferSize.x : maxPX; - int minPY = floor(minY); - minPY = minPY < 0 ? 0 : minPY; - int maxPY = ceil(maxY); - maxPY = maxPY > FrameBufferSize.y ? FrameBufferSize.y : maxPY; - - //鍒ゆ柇褰撳墠鍍忕礌鏄惁鍦ˋABB涓 - if(id.x < minPX || id.x > maxPX || id.y < minPY || id.y > maxPY){ - return; - } - - int x = id.x; - int y = id.y; - - //璁$畻閲嶅績鍧愭爣 - float3 c = ComputeBarycentric2D(x, y, v); - float alpha = c.x; - float beta = c.y; - float gamma = c.z; - if(alpha < 0 || beta < 0 || gamma < 0){ - return; - } - //閫忚鏍℃鎻掑硷紝z涓洪忚鏍℃鎻掑煎悗鐨剉iew space z鍊 - float z = 1.0f / (alpha / v[0].w + beta / v[1].w + gamma / v[2].w); - //zp涓洪忚鏍℃鎻掑煎悗鐨剆creen space z鍊 - float zp = (alpha * v[0].z / v[0].w + beta * v[1].z / v[1].w + gamma * v[2].z / v[2].w) * z; - - //娣卞害娴嬭瘯(娉ㄦ剰鎴戜滑杩欏効鐨剒鍊艰秺澶ц秺闈犺繎near plane锛屽洜姝ゅぇ鍊奸氳繃娴嬭瘯锛 - - //if(zp >= depth_buf[index]) - - //depth_buf[index] = zp; - - //閫忚鏍℃鎻掑 - - //float3 color_p = (alpha * t.Vertex0.Color / v[0].w + beta * t.Vertex1.Color / v[1].w + gamma * t.Vertex2.Color / v[2].w) * z; - //Vector2 uv_p = (alpha * t.Vertex0.Texcoord / v[0].w + beta * t.Vertex1.Texcoord / v[1].w + gamma * t.Vertex2.Texcoord / v[2].w) * z; - //Vector3 normal_p = (alpha * t.Vertex0.Normal / v[0].w + beta * t.Vertex1.Normal / v[1].w + gamma * t.Vertex2.Normal / v[2].w) * z; - //Vector3 worldPos_p = (alpha * t.Vertex0.WorldPos / v[0].w + beta * t.Vertex1.WorldPos / v[1].w + gamma * t.Vertex2.WorldPos / v[2].w) * z; - //Vector3 worldNormal_p = (alpha * t.Vertex0.WorldNormal / v[0].w + beta * t.Vertex1.WorldNormal / v[1].w + gamma * t.Vertex2.WorldNormal / v[2].w) * z; - - //if (CurrentFragmentShader != null) - { - //FragmentShaderInputData input = new FragmentShaderInputData(); - //input.Color = color_p; - //input.UV = uv_p; - //input.Texture = ro.texture; - //input.LocalNormal = normal_p; - //input.WorldPos = worldPos_p; - //input.WorldNormal = worldNormal_p; - - frameColorTexture[id.xy] = float4(1,1,1,1); - } - -} - - - -// void RasterizeTriangle(Triangle t, RenderingObject ro) -// { -// ProfileManager.BeginSample("Rasterizer.RasterizeTriangle"); -// var v = _tmpVector4s; -// v[0] = t.Vertex0.Position; -// v[1] = t.Vertex1.Position; -// v[2] = t.Vertex2.Position; - -// //Find out the bounding box of current triangle. -// float minX = v[0].x; -// float maxX = minX; -// float minY = v[0].y; -// float maxY = minY; - -// for(int i=1; i<3; ++i) -// { -// float x = v[i].x; -// if(x < minX) -// { -// minX = x; -// } else if(x > maxX) -// { -// maxX = x; -// } -// float y = v[i].y; -// if(y < minY) -// { -// minY = y; -// }else if(y > maxY) -// { -// maxY = y; -// } -// } - -// int minPX = Mathf.FloorToInt(minX); -// minPX = minPX < 0 ? 0 : minPX; -// int maxPX = Mathf.CeilToInt(maxX); -// maxPX = maxPX > _width ? _width : maxPX; -// int minPY = Mathf.FloorToInt(minY); -// minPY = minPY < 0 ? 0 : minPY; -// int maxPY = Mathf.CeilToInt(maxY); -// maxPY = maxPY > _height ? _height : maxPY; - -// if(_config.MSAA == MSAALevel.Disabled) -// { -// // 閬嶅巻褰撳墠涓夎褰㈠寘鍥翠腑鐨勬墍鏈夊儚绱狅紝鍒ゆ柇褰撳墠鍍忕礌鏄惁鍦ㄤ笁瑙掑舰涓 -// // 瀵逛簬鍦ㄤ笁瑙掑舰涓殑鍍忕礌锛屼娇鐢ㄩ噸蹇冨潗鏍囨彃鍊煎緱鍒版繁搴﹀硷紝骞朵娇鐢▃ buffer杩涜娣卞害娴嬭瘯鍜屽啓鍏 -// for(int y = minPY; y < maxPY; ++y) -// { -// for(int x = minPX; x < maxPX; ++x) -// { -// //if(IsInsideTriangle(x, y, t)) //-->妫娴嬫槸鍚﹀湪涓夎褰㈠唴姣斾娇鐢ㄩ噸蹇冨潗鏍囨娴嬭鎱紝鍥犳鍏堣绠楅噸蹇冨潗鏍囷紝鍐嶆鏌3涓潗鏍囨槸鍚︽湁灏忎簬0 -// { -// //璁$畻閲嶅績鍧愭爣 -// var c = ComputeBarycentric2D(x, y, t); -// float alpha = c.x; -// float beta = c.y; -// float gamma = c.z; -// if(alpha < 0 || beta < 0 || gamma < 0){ -// continue; -// } -// //閫忚鏍℃鎻掑硷紝z涓洪忚鏍℃鎻掑煎悗鐨剉iew space z鍊 -// float z = 1.0f / (alpha / v[0].w + beta / v[1].w + gamma / v[2].w); -// //zp涓洪忚鏍℃鎻掑煎悗鐨剆creen space z鍊 -// float zp = (alpha * v[0].z / v[0].w + beta * v[1].z / v[1].w + gamma * v[2].z / v[2].w) * z; - -// //娣卞害娴嬭瘯(娉ㄦ剰鎴戜滑杩欏効鐨剒鍊艰秺澶ц秺闈犺繎near plane锛屽洜姝ゅぇ鍊奸氳繃娴嬭瘯锛 -// int index = GetIndex(x, y); -// if(zp >= depth_buf[index]) -// { -// depth_buf[index] = zp; - -// //閫忚鏍℃鎻掑 -// ProfileManager.BeginSample("Rasterizer.RasterizeTriangle.AttributeInterpolation"); -// Color color_p = (alpha * t.Vertex0.Color / v[0].w + beta * t.Vertex1.Color / v[1].w + gamma * t.Vertex2.Color / v[2].w) * z; -// Vector2 uv_p = (alpha * t.Vertex0.Texcoord / v[0].w + beta * t.Vertex1.Texcoord / v[1].w + gamma * t.Vertex2.Texcoord / v[2].w) * z; -// Vector3 normal_p = (alpha * t.Vertex0.Normal / v[0].w + beta * t.Vertex1.Normal / v[1].w + gamma * t.Vertex2.Normal / v[2].w) * z; -// Vector3 worldPos_p = (alpha * t.Vertex0.WorldPos / v[0].w + beta * t.Vertex1.WorldPos / v[1].w + gamma * t.Vertex2.WorldPos / v[2].w) * z; -// Vector3 worldNormal_p = (alpha * t.Vertex0.WorldNormal / v[0].w + beta * t.Vertex1.WorldNormal / v[1].w + gamma * t.Vertex2.WorldNormal / v[2].w) * z; -// ProfileManager.EndSample(); - -// if (CurrentFragmentShader != null) -// { -// FragmentShaderInputData input = new FragmentShaderInputData(); -// input.Color = color_p; -// input.UV = uv_p; -// input.Texture = ro.texture; -// input.LocalNormal = normal_p; -// input.WorldPos = worldPos_p; -// input.WorldNormal = worldNormal_p; - -// ProfileManager.BeginSample("Rasterizer.RasterizeTriangle.FragmentShader"); -// frame_buf[index] = CurrentFragmentShader(input); -// ProfileManager.EndSample(); -// } - - - -// } -// } -// } -// } -// } - -// ProfileManager.EndSample(); -// } diff --git a/URasterizer/Assets/URasterizer/RenderingConfig.asset b/URasterizer/Assets/URasterizer/RenderingConfig.asset index eb1ee7d7098e2653d968d1b92611b7ab3c7f06f1..3cafb61403055f5ffb89e92296f861a38b233023 100644 --- a/URasterizer/Assets/URasterizer/RenderingConfig.asset +++ b/URasterizer/Assets/URasterizer/RenderingConfig.asset @@ -12,14 +12,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5fa123a60a768444af03a384cb34a74, type: 3} m_Name: RenderingConfig m_EditorClassIdentifier: - ClearColor: {r: 0.056692798, g: 0.41403675, b: 0.9245283, a: 0.24705882} + ClearColor: {r: 0, g: 0, b: 0, a: 1} + AmbientColor: {r: 0.0754717, g: 0.0754717, b: 0.0754717, a: 1} + RasterizerType: 1 WireframeMode: 0 BackfaceCulling: 1 DisplayBuffer: 0 MSAA: 0 BilinearSample: 1 FragmentShaderType: 1 - AmbientColor: {r: 0.0754717, g: 0.075044505, b: 0.075044505, a: 1} VertexColors: {fileID: 11400000, guid: a126a2fdc8a60c54e8a3aadb7db4bb3a, type: 2} ComputeShader: {fileID: 7200000, guid: caa96f337395ad9449e1be41546efcd6, type: 3} - RasterizerType: 1 diff --git a/URasterizer/Assets/URasterizer/Shaders.meta b/URasterizer/Assets/URasterizer/Shaders.meta new file mode 100644 index 0000000000000000000000000000000000000000..77d5de83b6dedfb026df6f32e0c77fc3bbd23bf2 --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: db6144c7af5ba0a43b63a0a8e34a1cad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/URasterizer/Assets/URasterizer/Shaders/URCommon.hlsl b/URasterizer/Assets/URasterizer/Shaders/URCommon.hlsl new file mode 100644 index 0000000000000000000000000000000000000000..85175beb860a684feee86600a3f2980a4b3d0eb2 --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URCommon.hlsl @@ -0,0 +1,29 @@ +struct VertexOutBuf +{ + float4 clipPos; + float3 worldPos; + float3 objectNormal; + float3 worldNormal; + float2 uv; +}; + +float4 clearColor; +int2 frameBufferSize; + +float4x4 matMVP; +float4x4 matModel; + +float3 worldSpaceCameraPos; +float3 worldSpaceLightDir; +float4 lightColor; +float4 ambientColor; + +StructuredBuffer vertexBuffer; +StructuredBuffer normalBuffer; +StructuredBuffer uvBuffer; +StructuredBuffer triangleBuffer; // All triangles of the mesh + +RWStructuredBuffer vertexOutBuffer; +RWTexture2D frameColorTexture; +RWTexture2D frameDepthTexture; + diff --git a/URasterizer/Assets/URasterizer/Shaders/URCommon.hlsl.meta b/URasterizer/Assets/URasterizer/Shaders/URCommon.hlsl.meta new file mode 100644 index 0000000000000000000000000000000000000000..2614d007d2e61ad01e100bd23724b85628075949 --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URCommon.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 252a3b656c0fa814fb91d0ef851fb108 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/URasterizer/Assets/URasterizer/Shaders/URComputeShader.compute b/URasterizer/Assets/URasterizer/Shaders/URComputeShader.compute new file mode 100644 index 0000000000000000000000000000000000000000..33ed770501e66ad71213fb1c5d3523834f8a746e --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URComputeShader.compute @@ -0,0 +1,85 @@ +#pragma kernel VertexProcess +#pragma kernel ClearFrame +#pragma kernel TriangleProcess + + +#include "URCommon.hlsl" +#include "URVertexShader.hlsl" +#include "URFragmentShader.hlsl" +#include "URTriangleProcess.hlsl" + + + +[numthreads(32,24,1)] +void ClearFrame(uint3 id : SV_DispatchThreadID) +{ + frameColorTexture[id.xy] = clearColor; + frameDepthTexture[id.xy] = 0; +} + +[numthreads(512,1,1)] +void VertexProcess (uint3 id : SV_DispatchThreadID) +{ + VertexTransform(id.x); +} + +[numthreads(512,1,1)] +void TriangleProcess(uint3 id : SV_DispatchThreadID) +{ + uint3 tri = triangleBuffer[id.x]; + int idx0 = tri.x; + int idx1 = tri.y; + int idx2 = tri.z; + + float4 v[3]; + v[0] = vertexOutBuffer[idx0].clipPos; + v[1] = vertexOutBuffer[idx1].clipPos; + v[2] = vertexOutBuffer[idx2].clipPos; + + if(Clipped(v)){ + return; + } + + //Perspective division, clip space to NDC + for (int k=0; k<3; k++) + { + v[k].x /= v[k].w; + v[k].y /= v[k].w; + v[k].z /= v[k].w; + } + + //backface culling + float3 e01 = v[1].xyz - v[0].xyz; + float3 e02 = v[2].xyz - v[0].xyz; + float3 crossv = cross(e01, e02); + if (crossv.z < 0) + { + return; + } + + //Viewport Transform锛 NDC to screen space + for (k = 0; k < 3; k++) + { + float4 vec = v[k]; + vec.x = 0.5f * frameBufferSize.x * (vec.x + 1.0f); + vec.y = 0.5f * frameBufferSize.y * (vec.y + 1.0f); + + //鍦ㄧ‖浠舵覆鏌撲腑锛孨DC鐨剒鍊肩粡杩囩‖浠剁殑閫忚闄ゆ硶涔嬪悗灏辩洿鎺ュ啓鍏ュ埌depth buffer浜嗭紝濡傛灉瑕佽皟鏁撮渶瑕佸湪鎶曞奖鐭╅樀涓皟鏁 + //鐢变簬鎴戜滑鏄蒋浠舵覆鏌擄紝鎵浠ュ彲浠ュ湪杩欓噷璋冩暣z鍊笺 + + //GAMES101绾﹀畾鐨凬DC鏄彸鎵嬪潗鏍囩郴锛寊鍊艰寖鍥存槸[-1,1]锛屼絾n涓1锛宖涓-1锛屽洜姝ゅ艰秺澶ц秺闈犺繎n銆 + //涓轰簡鍙鍖朌epth buffer锛屽皢鏈缁堢殑z鍊间粠[-1,1]鏄犲皠鍒癧0,1]鐨勮寖鍥达紝鍥犳鏈缁坣涓1, f涓0銆傜n瓒婅繎锛屾繁搴﹀艰秺澶с + //鐢变簬杩滃鐨剒鍊间负0锛屽洜姝lear鏃舵繁搴﹁娓呴櫎涓0锛岀劧鍚庢繁搴︽祴璇曟椂锛屼娇鐢℅REATER娴嬭瘯銆 + //(褰撶劧鎴戜滑涔熷彲浠ュ湪杩欏効鍙嶈浆z鍊硷紝鐒跺悗clear鏃朵娇鐢╢loat.MaxValue娓呴櫎锛屽苟涓旀繁搴︽祴璇曟椂浣跨敤LESS_EQUAL娴嬭瘯) + //娉ㄦ剰锛氳繖鍎跨殑z鍊艰皟鏁村苟涓嶆槸蹇呰鐨勶紝鍙槸涓轰簡鍙鍖栨椂渚夸簬鏄犲皠涓洪鑹插笺傚叾瀹炰篃鍙互鍦ㄥ彲瑙嗗寲鐨勫湴鏂硅皟鏁淬 + //浣嗘槸杩欎箞璋冩暣鍚庯紝姝eソ鍜孶nity鍦―irectX骞冲彴鐨凴everse z涓鏍凤紝璁﹏ear plane闄勮繎鐨剒鍊肩殑娴偣鏁扮簿搴︽彁楂樸 + vec.z = vec.z * 0.5f + 0.5f; + + v[k] = vec; + } + + RasterizeTriangle(idx0, idx1, idx2, v); +} + + + diff --git a/URasterizer/Assets/URasterizer/DefaultAssets/URComputeShader.compute.meta b/URasterizer/Assets/URasterizer/Shaders/URComputeShader.compute.meta similarity index 100% rename from URasterizer/Assets/URasterizer/DefaultAssets/URComputeShader.compute.meta rename to URasterizer/Assets/URasterizer/Shaders/URComputeShader.compute.meta diff --git a/URasterizer/Assets/URasterizer/Shaders/URFragmentShader.hlsl b/URasterizer/Assets/URasterizer/Shaders/URFragmentShader.hlsl new file mode 100644 index 0000000000000000000000000000000000000000..41e780b9a7ee6a1792d892c61dadda3dca2d69d2 --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URFragmentShader.hlsl @@ -0,0 +1,21 @@ + +Texture2D meshTexture; +SamplerState samplermeshTexture; + +float4 FSBlinnPhong(float3 worldPos, float3 worldNormal, float2 uv) +{ + float4 textureColor = meshTexture.SampleLevel(samplermeshTexture, uv, 0); //Compute shader涓笉鑳戒娇鐢⊿ample + + float4 ks = float4(0.7937f, 0.7937f, 0.7937f, 1.0f); + + float ndotl = dot(worldNormal, worldSpaceLightDir); + float4 diffuse = textureColor * lightColor * saturate(ndotl); + + float3 viewDir = normalize(worldSpaceCameraPos - worldPos); + float3 halfDir = normalize(viewDir + worldSpaceLightDir); + + float hdotn = dot(halfDir, worldNormal); + float4 specular = ks * lightColor * pow(saturate(hdotn), 150); + + return ambientColor + diffuse + specular; +} diff --git a/URasterizer/Assets/URasterizer/Shaders/URFragmentShader.hlsl.meta b/URasterizer/Assets/URasterizer/Shaders/URFragmentShader.hlsl.meta new file mode 100644 index 0000000000000000000000000000000000000000..d495ece3238bcb1dc1143736f15b71b95b958904 --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URFragmentShader.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 6abde8a54e513cd42950ae3ee5bb48ec +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/URasterizer/Assets/URasterizer/Shaders/URTriangleProcess.hlsl b/URasterizer/Assets/URasterizer/Shaders/URTriangleProcess.hlsl new file mode 100644 index 0000000000000000000000000000000000000000..40335e36f69abe6961c6430f5d347fa3fcb3dcde --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URTriangleProcess.hlsl @@ -0,0 +1,118 @@ + +bool Clipped(float4 v[3]) +{ + //Clip space浣跨敤GAMES101瑙勮寖锛屽彸鎵嬪潗鏍囩郴锛宯涓+1锛 f涓-1 + //瑁佸壀锛堜粎鏁翠綋鍓旈櫎锛 + for (int i = 0; i < 3; ++i) + { + float4 vertex = v[i]; + float w = vertex.w; + w = w >= 0 ? w : -w; //鐢变簬NDC涓绘槸婊¤冻-1<=Zndc<=1, 鑰屽綋 w < 0 鏃讹紝-w >= Zclip = Zndc*w >= w銆傛墍浠ユ鏃禼lip space鐨勫潗鏍囪寖鍥存槸[w,-w], 涓轰簡姣旇緝鏃舵洿鏄庣‘锛屽皢w鍙栨 + + bool inside = (vertex.x <= w && vertex.x >= -w + && vertex.y <= w && vertex.y >= -w + && vertex.z <= w && vertex.z >= -w); + if (inside) + { + //涓嶈鍓笁瑙掑舰锛屽彧瑕佹湁浠绘剰涓鐐瑰湪clip space涓垯涓夎褰㈡暣浣撲繚鐣 + return false; + } + } + + //涓変釜椤剁偣閮戒笉鍦ㄤ笁瑙掑舰涓垯鍓旈櫎 + return true; +} + + + +float3 ComputeBarycentric2D(float x, float y, float4 v[3]) +{ + float c1 = (x * (v[1].y - v[2].y) + (v[2].x - v[1].x) * y + v[1].x * v[2].y - v[2].x * v[1].y) / (v[0].x * (v[1].y - v[2].y) + (v[2].x - v[1].x) * v[0].y + v[1].x * v[2].y - v[2].x * v[1].y); + float c2 = (x * (v[2].y - v[0].y) + (v[0].x - v[2].x) * y + v[2].x * v[0].y - v[0].x * v[2].y) / (v[1].x * (v[2].y - v[0].y) + (v[0].x - v[2].x) * v[1].y + v[2].x * v[0].y - v[0].x * v[2].y); + float c3 = (x * (v[0].y - v[1].y) + (v[1].x - v[0].x) * y + v[0].x * v[1].y - v[1].x * v[0].y) / (v[2].x * (v[0].y - v[1].y) + (v[1].x - v[0].x) * v[2].y + v[0].x * v[1].y - v[1].x * v[0].y); + return float3(c1, c2, c3); +} + +//v: screen space vertex coordinates +void RasterizeTriangle(int idx0, int idx1, int idx2, float4 v[3]) +{ + //Find out the bounding box of current triangle. + float minX = v[0].x; + float maxX = minX; + float minY = v[0].y; + float maxY = minY; + + for(int i=1; i<3; ++i) + { + float x = v[i].x; + if(x < minX) + { + minX = x; + } else if(x > maxX) + { + maxX = x; + } + float y = v[i].y; + if(y < minY) + { + minY = y; + }else if(y > maxY) + { + maxY = y; + } + } + + int minPX = floor(minX); + minPX = minPX < 0 ? 0 : minPX; + int maxPX = ceil(maxX); + maxPX = maxPX > frameBufferSize.x ? frameBufferSize.x : maxPX; + int minPY = floor(minY); + minPY = minPY < 0 ? 0 : minPY; + int maxPY = ceil(maxY); + maxPY = maxPY > frameBufferSize.y ? frameBufferSize.y : maxPY; + + VertexOutBuf vertex0 = vertexOutBuffer[idx0]; + VertexOutBuf vertex1 = vertexOutBuffer[idx1]; + VertexOutBuf vertex2 = vertexOutBuffer[idx2]; + + for(int y = minPY; y < maxPY; ++y) + { + for(int x = minPX; x < maxPX; ++x) + { + //璁$畻閲嶅績鍧愭爣 + float3 c = ComputeBarycentric2D(x, y, v); + float alpha = c.x; + float beta = c.y; + float gamma = c.z; + if(alpha < 0 || beta < 0 || gamma < 0){ + continue; + } + //閫忚鏍℃鎻掑硷紝z涓洪忚鏍℃鎻掑煎悗鐨剉iew space z鍊 + float z = 1.0f / (alpha / v[0].w + beta / v[1].w + gamma / v[2].w); + //zp涓洪忚鏍℃鎻掑煎悗鐨剆creen space z鍊 + float zp = (alpha * v[0].z / v[0].w + beta * v[1].z / v[1].w + gamma * v[2].z / v[2].w) * z; + + //娣卞害娴嬭瘯(娉ㄦ剰鎴戜滑杩欏効鐨剒鍊艰秺澶ц秺闈犺繎near plane锛屽洜姝ゅぇ鍊奸氳繃娴嬭瘯锛 + + if(zp > frameDepthTexture[uint2(x,y)]) + { + + frameDepthTexture[uint2(x,y)] = zp; + + //閫忚鏍℃鎻掑 + + //float3 color_p = (alpha * t.Vertex0.Color / v[0].w + beta * t.Vertex1.Color / v[1].w + gamma * t.Vertex2.Color / v[2].w) * z; + float2 uv_p = (alpha * vertex0.uv / v[0].w + beta * vertex1.uv / v[1].w + gamma * vertex2.uv / v[2].w) * z; + float3 normal_p = (alpha * vertex0.objectNormal / v[0].w + beta * vertex1.objectNormal / v[1].w + gamma * vertex2.objectNormal / v[2].w) * z; + float3 worldPos_p = (alpha * vertex0.worldPos / v[0].w + beta * vertex1.worldPos / v[1].w + gamma * vertex2.worldPos / v[2].w) * z; + float3 worldNormal_p = (alpha * vertex0.worldNormal / v[0].w + beta * vertex1.worldNormal / v[1].w + gamma * vertex2.worldNormal / v[2].w) * z; + + frameColorTexture[uint2(x,y)] = FSBlinnPhong(worldPos_p, worldNormal_p, uv_p); + } + } + } + + + + +} diff --git a/URasterizer/Assets/URasterizer/Shaders/URTriangleProcess.hlsl.meta b/URasterizer/Assets/URasterizer/Shaders/URTriangleProcess.hlsl.meta new file mode 100644 index 0000000000000000000000000000000000000000..67a876c82b281b17139e41a1e43b208c4db921ca --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URTriangleProcess.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 85e2d77fa024824419b563f193a7472e +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/URasterizer/Assets/URasterizer/Shaders/URVertexShader.hlsl b/URasterizer/Assets/URasterizer/Shaders/URVertexShader.hlsl new file mode 100644 index 0000000000000000000000000000000000000000..f7d3fe59b8fb4b8c4b1211feafc4182a393ab766 --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URVertexShader.hlsl @@ -0,0 +1,11 @@ +void VertexTransform (uint vertexIdx) +{ + float4 pos = float4(vertexBuffer[vertexIdx].x, vertexBuffer[vertexIdx].y, -vertexBuffer[vertexIdx].z, 1.0f); + float3 normal = float3(normalBuffer[vertexIdx].x, normalBuffer[vertexIdx].y, -normalBuffer[vertexIdx].z); + + vertexOutBuffer[vertexIdx].clipPos = mul(matMVP, pos); + vertexOutBuffer[vertexIdx].worldPos = mul(matModel, pos).xyz; + vertexOutBuffer[vertexIdx].objectNormal = normal; + vertexOutBuffer[vertexIdx].worldNormal = mul( (float3x3)matModel , normal); + vertexOutBuffer[vertexIdx].uv = uvBuffer[vertexIdx]; +} \ No newline at end of file diff --git a/URasterizer/Assets/URasterizer/Shaders/URVertexShader.hlsl.meta b/URasterizer/Assets/URasterizer/Shaders/URVertexShader.hlsl.meta new file mode 100644 index 0000000000000000000000000000000000000000..a3015021293149e741819a45749134f1a69f2360 --- /dev/null +++ b/URasterizer/Assets/URasterizer/Shaders/URVertexShader.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 436233d9a8473544e826c6008e7b2e3f +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: