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

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Artcraft
Messages : 33
Inscription : 21 Août 2019 13:38

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

Message par Artcraft » 21 Août 2019 17:07

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 !

@+
Dernière édition par Artcraft le 23 Août 2019 20:18, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 21 Août 2019 17:51

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
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Artcraft
Messages : 33
Inscription : 21 Août 2019 13:38

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

Message par Artcraft » 21 Août 2019 17:56

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...

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 21 Août 2019 18:07

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.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Artcraft
Messages : 33
Inscription : 21 Août 2019 13:38

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

Message par Artcraft » 21 Août 2019 18:10

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é...

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 21 Août 2019 18:23

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 ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Artcraft
Messages : 33
Inscription : 21 Août 2019 13:38

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

Message par Artcraft » 21 Août 2019 18:32

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.

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 21 Août 2019 18:44

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
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Artcraft
Messages : 33
Inscription : 21 Août 2019 13:38

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

Message par Artcraft » 21 Août 2019 18:55

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...

Artcraft
Messages : 33
Inscription : 21 Août 2019 13:38

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

Message par Artcraft » 21 Août 2019 19:08

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...

Répondre

Revenir vers « (C#) CSharp »