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: