Page 1 sur 2

[DB] modifier la variable d'un shader sur un gameobject en C# [Résolu]

Publié : 21 Août 2019 17:07
par Artcraft
Bonjour à tous,
je suis nouveau sur ce forum donc je me présente brièvement :
à la base graphiste 3d, je suis plus orienté 3d technical artist depuis quelques années
et développe des trucs sur Vvvv, touch designer et Max/msp... ( visual programming en somme)
j'ai quelques connaissances empiriques en c++ et c# mais suis plutôt mauvais..

présentation faite, je vous expose mon problème :

Je souhaite modifier une variable dans un shader appliqué à un gameobject instancié,
et ce, depuis un script C#...

En gros j'ai une FFT en array de 512 qui doit modifier une variable sur chaque instance de mon objet.
j'arrive bien à l'appliquer a la taille (localScale) mais suis bien incapable de l'appliquer à une variable du shader.

Le Shader :

Code : Tout sélectionner

Shader "Flat/Sin Wave" {
	Properties{
		_ForegroundColor("Foreground Color", Color) = (1,1,1,0)
		_BackgroundColor("Background Color", Color) = (0,0,0,0)
		_ForegroundMask("Foreground Mask", 2D) = "white" {}
		_ForegroundCutoff("Foreground Cutoff", Range(0,1)) = 0.5
		_BackgroundCutoff("Background Cutoff", Range(0,1)) = 0.5
		_Radius("Radius", Range(0.0,1.0)) = 0.5
	}
		SubShader{
		Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
		LOD 100
		ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha 
		CGPROGRAM

#pragma surface surf Standard 
#pragma target 3.0
	sampler2D _ForegroundMask;
	struct Input {
		float2 uv_ForegroundMask;
	};

	fixed4 _ForegroundColor;
	fixed4 _BackgroundColor;
	half _ForegroundCutoff;
	half _BackgroundCutoff;
	half _Radius;
	

	void surf(Input IN, inout SurfaceOutputStandard color) {

		fixed x = (-0.5 + IN.uv_ForegroundMask.x) * 2;
		fixed y = (-0.5 + IN.uv_ForegroundMask.y) * 2;
		fixed radius = 0.5 + sin(x * 3.1415926535) * _Radius;
		radius -= (0.5 * y + 0.5);
		clip(radius - _BackgroundCutoff);
		clip(_ForegroundCutoff - radius);
		color.Albedo = _BackgroundColor;
		color.Albedo.r = sin(x * 3.14) * 0.5 + 0.5;
	}
	ENDCG
	}
	
}
et le script C# :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Instanciate512Circles : MonoBehaviour
{

    public GameObject _sampleCirclePrefab;
    GameObject[] _sampleCircle = new GameObject[512];
    public float _maxScale;

    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 512; i++)
        {
            GameObject _instanceSampleCircle = (GameObject)Instantiate(_sampleCirclePrefab);
            _instanceSampleCircle.transform.position = this.transform.position;
            _instanceSampleCircle.transform.parent = this.transform;
            _instanceSampleCircle.name = "SampleCircle" + i;
            _sampleCircle[i] = _instanceSampleCircle;
        }   
    }

    // Update is called once per frame
    void Update()
    {
        for (int i = 0; i < 512; i++)
        {
            
            if (_sampleCircle != null)
            {
                _sampleCircle[i].transform.localScale = new Vector3((AudioCraft._samples[i] * _maxScale) + 2, (AudioCraft._samples[i] * _maxScale) + 2, 1);
                _sampleCircle[i].transform.localEulerAngles = new Vector3(0, 0, (AudioCraft._samples[i] * 360 * i));
                
            }
        }
    }
}
Voila typiquement, je voudrais appliquer

Code : Tout sélectionner

AudioCraft._samples[i]
à

Code : Tout sélectionner

_Radius
du shader.
je sais que je suis sensé utiliser "setFloat" mais j'y arrive pas :(

voila merci d'avance pour votre aide !

@+

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 17:51
par Max
Bonjour,
Artcraft a écrit :
21 Août 2019 17:07
Voila typiquement, je voudrais appliquer

Code : Tout sélectionner

AudioCraft._samples[i]
à

Code : Tout sélectionner

_Radius
du shader.
je sais que je suis sensé utiliser "setFloat" mais j'y arrives pas :(
Ca veut dire quoi tu n'y arrive pas ? Tu as des erreurs ?
La doc est souvent d'un grand secours: Material.SetFloat

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 17:56
par Artcraft
Bonjour Max,

eh bien étant débutant en unity et en C#, j'ai du mal à appliquer les infos de la doc...
j'ai bien essayé comme expliqué, mais effectivement je me retrouve systématiquement avec des erreurs type :
gameobjet does not contain a definition for "material" etc...

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 18:07
par Max
Je trouve que pour un débutant tu ponds du code déjà bien avancé.
Artcraft a écrit :
21 Août 2019 17:56
gameobjet does not contain a definition for "material" etc...
Normal, Material n'est pas une propriété des GameObject.
Si tu as vu la doc (le lien que j'ai donné plus haut), material est lié au Renderer. Le code fournis en exemple dans la page de Material.SetFloat est assez accessible en terme de compréhension.

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 18:10
par Artcraft
alors oui ça j'avais compris mais du coup,
quand j'applique ce qu'il y a dans la doc,
ça me dit ça :

MissingComponentException: There is no 'Renderer' attached to the "InstanceCircle" game object, but a script is trying to access it. You probably need to add a Renderer to the game object "InstanceCircle". Or your script needs to check if the component is attached before using it.

du coup je dois attacher un renderer au gameObject ?

edit: débutant en unity ;) ça fait pas 24h que je l'ai intallé...

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 18:23
par Max
Ben la c'est un peu les bases d'Unity.
Dans ton prefab (à priori _sampleCirclePrefab), qui dit shader, dit material. Qui dit material, dit Renderer.
Donc ton prefab, il est construit comment ?

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 18:32
par Artcraft
eh bien le prefab c'est un mesh importé, il s'appelle circle dans les assets...
puis instancié 512 fois via C#...

euh en gros je l'ai droppé dans la scène puis re droppé dans les assets...
puis je l'ai mis dans la case sample circle prefab du game object.

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 18:44
par Max
Au fait, c'est quoi les AudioCraft, car dans ton code j'en vois pas la définition.
Artcraft a écrit :
21 Août 2019 18:32
eh bien le prefab c'est un mesh importé, il s'appelle circle dans les assets...
Hmmm, c'est là que j'ai du mal à suivre. Mesh importé = Renderer:
Image

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 18:55
par Artcraft
eh ben AudioCraft c'est le script qui active le microphone, fait la FFT et la convertit en array 512 float...

oui mon mesh a bien un renderer mais pas le gameObject sur lequel est assigné le script...

Re: [DB] modifier la variable d'un shader sur un gameobject en C#

Publié : 21 Août 2019 19:08
par Artcraft
par contre si j'assigne le script directement sur le prefab,
pas d'erreur mais seul le prefab initial est modifié alors que les instances ne le sont pas...

ya quelque chose que je pige pas dans le concept...