提交 d5088885 编写于 作者: H happyfire

- refractor code to use Burst compiler

上级 169e1118
......@@ -25,7 +25,7 @@ namespace URasterizer
public Texture2D texture;
public FragmentShader CurrentFragmentShader {get; set;}
ShaderUniforms Uniforms;
//Stats
int _trianglesAll, _trianglesRendered;
......@@ -132,34 +132,18 @@ namespace URasterizer
}
public void SetupUniforms(Camera camera, Light mainLight)
{
switch (_config.FragmentShaderType)
{
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;
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;
Uniforms.WorldSpaceLightDir = -lightDir;
Uniforms.LightColor = mainLight.color * mainLight.intensity;
Uniforms.AmbientColor = _config.AmbientColor;
TransformTool.SetupViewProjectionMatrix(camera, Aspect, out _matView, out _matProjection);
}
......@@ -654,8 +638,7 @@ namespace URasterizer
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;
......@@ -668,12 +651,19 @@ namespace URasterizer
input.WorldNormal = worldNormal_p;
ProfileManager.BeginSample("Rasterizer.RasterizeTriangle.FragmentShader");
frame_buf[index] = CurrentFragmentShader(input);
ProfileManager.EndSample();
}
switch(_config.FragmentShaderType){
case ShaderType.BlinnPhong:
frame_buf[index] = ShaderContext.FSBlinnPhong(input, Uniforms);
break;
case ShaderType.NormalVisual:
frame_buf[index] = ShaderContext.FSNormalVisual(input);
break;
case ShaderType.VertexColor:
frame_buf[index] = ShaderContext.FSVertexColor(input);
break;
}
ProfileManager.EndSample();
}
}
}
......
......@@ -39,9 +39,7 @@ namespace URasterizer
public Vector3 WorldSpaceLightDir;
public Color LightColor;
public Color AmbientColor;
}
public delegate Color FragmentShader(FragmentShaderInputData input);
}
public enum ShaderType
{
......@@ -51,8 +49,7 @@ namespace URasterizer
}
public class ShaderContext
{
public static ShaderUniforms Uniforms;
{
public static RenderingConfig Config;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
......@@ -70,7 +67,7 @@ namespace URasterizer
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Color FSBlinnPhong(FragmentShaderInputData input)
public static Color FSBlinnPhong(FragmentShaderInputData input, ShaderUniforms Uniforms)
{
Color textureColor;
int w = input.TextureWidth;
......
......@@ -22,9 +22,7 @@ namespace URasterizer
Color[] temp_buf;
float[] temp_depth_buf;
public Texture2D texture;
public FragmentShader CurrentFragmentShader {get; set;}
public Texture2D texture;
//Stats
int _trianglesAll, _trianglesRendered;
......@@ -40,6 +38,8 @@ namespace URasterizer
public Texture ColorTexture { get=>texture; }
ShaderUniforms Uniforms;
public JobRasterizer(int w, int h, RenderingConfig config)
{
......@@ -106,34 +106,18 @@ namespace URasterizer
}
public void SetupUniforms(Camera camera, Light mainLight)
{
switch (_config.FragmentShaderType)
{
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;
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;
Uniforms.WorldSpaceLightDir = -lightDir;
Uniforms.LightColor = mainLight.color * mainLight.intensity;
Uniforms.AmbientColor = _config.AmbientColor;
TransformTool.SetupViewProjectionMatrix(camera, Aspect, out _matView, out _matProjection);
}
......@@ -184,6 +168,7 @@ namespace URasterizer
triJob.TextureHeight = ro.texture.height;
triJob.UseBilinear = _config.BilinearSample;
triJob.fsType = _config.FragmentShaderType;
triJob.Uniforms = Uniforms;
JobHandle triHandle = triJob.Schedule(ro.jobData.trianglesData.Length, 2, vsHandle);
triHandle.Complete();
......
......@@ -2,9 +2,11 @@ using System;
using UnityEngine;
using Unity.Jobs;
using Unity.Collections;
using Unity.Burst;
namespace URasterizer
{
{
[BurstCompile]
public struct TriangleJob : IJobParallelFor
{
[ReadOnly]
......@@ -29,7 +31,9 @@ namespace URasterizer
public bool UseBilinear;
public ShaderType fsType;
public ShaderType fsType;
public ShaderUniforms Uniforms;
public void Execute(int index)
......@@ -245,7 +249,7 @@ namespace URasterizer
switch(fsType){
case ShaderType.BlinnPhong:
frameBuffer[index] = ShaderContext.FSBlinnPhong(input);
frameBuffer[index] = ShaderContext.FSBlinnPhong(input, Uniforms);
break;
case ShaderType.NormalVisual:
frameBuffer[index] = ShaderContext.FSNormalVisual(input);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册