Если вы работаете в браузере, вы не можете загружать локальные файлы .
Но довольно просто запустить dev-сервер, в командной строке, просто cd
в каталог с вашими файлами, затем:
python -m SimpleHTTPServer
(или python -m http.server
с помощью python 3)
Теперь в вашем браузере перейдите к localhost:3000
(или :8000
или что-то, что показано на командной строке).
Следующие используются для работы в более старых версиях d3:
var json = {"my": "json"};
d3.json(json, function(json) {
root = json;
root.x0 = h / 2;
root.y0 = 0;
});
Вы не можете сделать это с помощью поверхностных шейдеров, но вы можете сделать это очень эффективно с вершинными фрагментными шейдерами. Unity хранит 4 источника света ближайших точек в наборе векторов, которые будут использоваться для источников света на каждую вершину (не важно). К счастью, они также доступны в фрагментном шейдере, так что вы можете использовать их, чтобы закрасить все 4 источника света за один проход! Когда вы суммируете все источники света, убедитесь, что их интенсивность не может превышать 1. Вот быстрый шейдер, который я собрал для вас:
Shader "Unlit/ToonTest"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Name "FORWARD"
Tags { "LightMode" = "ForwardBase" "RenderType" = "TransparentCutout" "Queue"="AlphaTest"}
Cull Off
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
half3 normal : NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float3 worldPos : TEXCOORD1;
float3 ambient : TEXCOORD2;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.ambient = ShadeSH9(mul(unity_ObjectToWorld, float4(v.normal, 0.0 ))); // Ambient from spherical harmonics
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
float3 Shade4Lights (
float4 lightPosX, float4 lightPosY, float4 lightPosZ,
float3 lightColor0, float3 lightColor1, float3 lightColor2, float3 lightColor3,
float4 lightAttenSq,
float3 pos)
{
// to light vectors
float4 toLightX = lightPosX - pos.x;
float4 toLightY = lightPosY - pos.y;
float4 toLightZ = lightPosZ - pos.z;
// squared lengths
float4 lengthSq = 0;
lengthSq += toLightX * toLightX;
lengthSq += toLightY * toLightY;
lengthSq += toLightZ * toLightZ;
// don't produce NaNs if some vertex position overlaps with the light
lengthSq = max(lengthSq, 0.000001);
// attenuation
float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq);
float4 diff = atten; //ndotl * atten;
// final color
float3 col = 0;
col += lightColor0 * diff.x;
col += lightColor1 * diff.y;
col += lightColor2 * diff.z;
col += lightColor3 * diff.w;
return col;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
half3 intensity = Shade4Lights(unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0, unity_LightColor[0], unity_LightColor[1], unity_LightColor[2], unity_LightColor[3], unity_4LightAtten0, i.worldPos);
intensity = min((half3)1, i.ambient + intensity);
col.rgb *= intensity;
clip(col.a - 0.5);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
Функция «Shade4Lights» является модифицированной версией Unity "Shade4PointLights", с рассеянным рассеянным освещением Ламберта (только ослабление). Вам также необходимо добавить функцию RetroAA в выборку текстур. Ваше значение отсечения - это «- 0.5» внутри функции «clip» - вы можете выставить это, если вам это нужно. Если вам нужно отбрасывать тени для этого шейдера, вы можете скопировать / вставить теневой проход из стандартного шейдера Unity (вы можете скачать исходный код с их страницы). Для получения тени вам необходимо добавить несколько строк в шейдер - снова проверьте исходный код для этого.
Подробнее о встроенных переменных шейдера можно прочитать здесь:
https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html