提交 dc6025c2 编写于 作者: H happyfire

vertex shader

stat
上级 c265fe7b
......@@ -316,6 +316,7 @@ GameObject:
- component: {fileID: 264331600}
- component: {fileID: 264331599}
- component: {fileID: 264331601}
- component: {fileID: 264331598}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
......@@ -323,6 +324,20 @@ GameObject:
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &264331598
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 264331597}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6521a9dfaf0764545a74885d9b664e06, type: 3}
m_Name:
m_EditorClassIdentifier:
TrianglesStat: {fileID: 1899433435}
VerticesStat: {fileID: 1292409240}
--- !u!20 &264331599
Camera:
m_ObjectHideFlags: 0
......@@ -354,7 +369,7 @@ Camera:
m_Depth: -1
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_Bits: 0
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
......@@ -667,7 +682,7 @@ Animator:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 963210794}
m_Enabled: 1
m_Enabled: 0
m_Avatar: {fileID: 0}
m_Controller: {fileID: 9100000, guid: a5d59b3801cddbb458d4c0acecdf77ed, type: 2}
m_CullingMode: 0
......@@ -678,6 +693,85 @@ Animator:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorControllerStateOnDisable: 0
--- !u!1 &1145256121
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1145256122}
- component: {fileID: 1145256124}
- component: {fileID: 1145256123}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1145256122
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1145256121}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1958761793}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1145256123
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1145256121}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0.9811321, b: 0.030918626, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 22
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 2
m_MaxSize: 40
m_Alignment: 4
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: URasterizer
--- !u!222 &1145256124
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1145256121}
m_CullTransparentMesh: 1
--- !u!1 &1292409238
GameObject:
m_ObjectHideFlags: 0
......@@ -708,12 +802,12 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1958761793}
m_RootOrder: 1
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 160, y: 26.1044}
m_SizeDelta: {x: 0, y: 26.1044}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1292409240
MonoBehaviour:
......@@ -739,10 +833,10 @@ MonoBehaviour:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 20
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 2
m_MaxSize: 40
m_Alignment: 0
m_BestFit: 1
m_MinSize: 10
m_MaxSize: 20
m_Alignment: 3
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
......@@ -964,7 +1058,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1825649040}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 2, y: 0, z: 0}
m_LocalPosition: {x: -2.43, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 963210798}
......@@ -1014,12 +1108,12 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1958761793}
m_RootOrder: 0
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 160, y: 30}
m_SizeDelta: {x: 0, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1899433435
MonoBehaviour:
......@@ -1045,10 +1139,10 @@ MonoBehaviour:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 20
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 2
m_MaxSize: 40
m_Alignment: 0
m_BestFit: 1
m_MinSize: 10
m_MaxSize: 20
m_Alignment: 3
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
......@@ -1186,6 +1280,7 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1145256122}
- {fileID: 1899433434}
- {fileID: 1292409239}
m_Father: {fileID: 900208196}
......@@ -1193,8 +1288,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -119.32251, y: -73.23816}
m_SizeDelta: {x: 203.4912, y: 115.5237}
m_AnchoredPosition: {x: -129.33313, y: -69.1431}
m_SizeDelta: {x: 223.5125, y: 107.3335}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1958761794
MonoBehaviour:
......@@ -1217,7 +1312,7 @@ MonoBehaviour:
m_Spacing: 5
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 0
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
......
......@@ -65,7 +65,12 @@ namespace URasterizer
Debug.Log($"screen size: {w}x{h}");
_rasterizer = new Rasterizer(w, h, _config);
rawImg.texture = _rasterizer.texture;
rawImg.texture = _rasterizer.texture;
var statPanel = this.GetComponent<StatsPanel>();
if (statPanel != null) {
_rasterizer.StatDelegate += statPanel.StatDelegate;
}
}
......
......@@ -10,6 +10,8 @@ namespace URasterizer
Depth = 2
}
public delegate void OnRasterizerStatUpdate(int verticesAll, int trianglesAll, int trianglesRendered);
public class Rasterizer
{
int _width;
......@@ -45,8 +47,11 @@ namespace URasterizer
public Texture2D texture;
//Stats
public int Stats_Triangles;
public int Stats_Vertices;
int _trianglesAll, _trianglesRendered;
int _verticesAll;
public OnRasterizerStatUpdate StatDelegate;
public Rasterizer(int w, int h, RenderingConfig config)
{
......@@ -104,6 +109,9 @@ namespace URasterizer
{
FillArray(depth_buf, float.MaxValue);
}
_trianglesAll = _trianglesRendered = 0;
_verticesAll = 0;
}
public void SetupViewProjectionMatrix(Camera camera)
......@@ -135,28 +143,37 @@ namespace URasterizer
Matrix4x4 mvp = _matProjection * _matView * _matModel;
_verticesAll += mesh.vertexCount;
_trianglesAll += mesh.triangles.Length / 3;
//Unity模型本地坐标系也是左手系,需要转成我们使用的右手系
//1. z轴反转
//2. 三角形顶点环绕方向从顺时针改成逆时针
//vertex shader
Vector4[] csVertices = new Vector4[mesh.vertexCount]; //clip space vertices
for(int i=0; i<mesh.vertexCount; ++i)
{
var vert = mesh.vertices[i];
csVertices[i] = mvp * new Vector4(vert.x, vert.y, -vert.z, 1); //注意这儿反转了z坐标
}
var indices = mesh.triangles;
for(int i=0; i< indices.Length; i+=3)
{
//Unity模型本地坐标系也是左手系,需要转成我们使用的右手系
//1. z轴反转
//2. 三角形顶点环绕方向从顺时针改成逆时针
{
//注意这儿对调了v0和v1的索引,因为原来的 0,1,2是顺时针的,对调后是 1,0,2是逆时针的
//Unity Quard模型的两个三角形索引分别是 0,3,1,3,0,2 转换后为 3,0,1,0,3,2
int idx0 = indices[i+1];
int idx1 = indices[i];
int idx2 = indices[i+2];
//vertex shader
//world to clip space
Vector4[] v =
{
mvp * new Vector4(mesh.vertices[idx0].x, mesh.vertices[idx0].y, -mesh.vertices[idx0].z, 1), //注意这儿反转了z坐标
mvp * new Vector4(mesh.vertices[idx1].x, mesh.vertices[idx1].y, -mesh.vertices[idx1].z, 1),
mvp * new Vector4(mesh.vertices[idx2].x, mesh.vertices[idx2].y, -mesh.vertices[idx2].z, 1),
csVertices[idx0],
csVertices[idx1],
csVertices[idx2]
};
......@@ -189,6 +206,8 @@ namespace URasterizer
}
}
++_trianglesRendered;
//NDC to screen space, viewport transform
for (int k = 0; k < 3; k++)
......@@ -517,6 +536,11 @@ namespace URasterizer
{
texture.SetPixels(frame_buf);
texture.Apply();
if (StatDelegate != null)
{
StatDelegate(_verticesAll, _trianglesAll, _trianglesRendered);
}
}
......
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class StatsPanel : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
public Text TrianglesStat;
public Text VerticesStat;
// Update is called once per frame
void Update()
public void StatDelegate(int vertices, int triangles, int trianglesRendered)
{
TrianglesStat.text = $"Triangles: {trianglesRendered} / {triangles}";
VerticesStat.text = $"Vertices: {vertices}";
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册