在着色器中使用来自 c# 脚本的函数
Using functions from the c# script inside the shader
我正在尝试编写一个片段着色器,它会根据位置给出不同的颜色。为此,我写了一个脚本 returns 来自给定 vector3 的颜色,我想在着色器中调用这个函数。有可能吗?
我的代码:
using System.Collections.Generic;
using UnityEngine;
public class CustomLight : MonoBehaviour
{
public static List<CustomLight> lights = new List<CustomLight>();
[Min(0)]
public float intensity = 1;
public Color color = Color.white;
[Min(0)]
public float radius = 4;
[Range(0, 1)]
public float innerRadius = 0;
public Color GetLight(Vector3 point)
{
if (intensity <= 0 || radius <= 0) return Color.clear;
float value = 0;
float distanceSqr = (point - transform.position).sqrMagnitude;
if (distanceSqr >= radius * radius) return Color.clear;
if (innerRadius == 1) value = 1;
else
{
if (distanceSqr <= radius * radius * innerRadius * innerRadius) value = 1;
else value = Mathf.InverseLerp(radius, radius * innerRadius, Mathf.Sqrt(distanceSqr));
}
return color * intensity * value;
}
private void OnEnable()
{
if (!lights.Contains(this)) lights.Add(this);
}
private void OnDisable()
{
lights.Remove(this);
}
}
我还没有写任何着色器,因为我什至不知道从哪里开始。我需要场景中所有脚本的结果总和,然后将其乘以着色器的颜色。
我为糟糕的英语道歉
C# 函数 运行 在 CPU 上,而着色器 运行 在 GPU 上,因此您不能从着色器调用 c# 函数。
但是,您可以通过 Material.SetX 方法访问通过材质传递给着色器的变量,这可能最接近您尝试实现的目标。
我正在尝试编写一个片段着色器,它会根据位置给出不同的颜色。为此,我写了一个脚本 returns 来自给定 vector3 的颜色,我想在着色器中调用这个函数。有可能吗?
我的代码:
using System.Collections.Generic;
using UnityEngine;
public class CustomLight : MonoBehaviour
{
public static List<CustomLight> lights = new List<CustomLight>();
[Min(0)]
public float intensity = 1;
public Color color = Color.white;
[Min(0)]
public float radius = 4;
[Range(0, 1)]
public float innerRadius = 0;
public Color GetLight(Vector3 point)
{
if (intensity <= 0 || radius <= 0) return Color.clear;
float value = 0;
float distanceSqr = (point - transform.position).sqrMagnitude;
if (distanceSqr >= radius * radius) return Color.clear;
if (innerRadius == 1) value = 1;
else
{
if (distanceSqr <= radius * radius * innerRadius * innerRadius) value = 1;
else value = Mathf.InverseLerp(radius, radius * innerRadius, Mathf.Sqrt(distanceSqr));
}
return color * intensity * value;
}
private void OnEnable()
{
if (!lights.Contains(this)) lights.Add(this);
}
private void OnDisable()
{
lights.Remove(this);
}
}
我还没有写任何着色器,因为我什至不知道从哪里开始。我需要场景中所有脚本的结果总和,然后将其乘以着色器的颜色。
我为糟糕的英语道歉
C# 函数 运行 在 CPU 上,而着色器 运行 在 GPU 上,因此您不能从着色器调用 c# 函数。
但是,您可以通过 Material.SetX 方法访问通过材质传递给着色器的变量,这可能最接近您尝试实现的目标。