101 votes

Dans WebGL, quelles sont les différences entre un attribut, une variable uniforme et une variable variable ?

Y a-t-il une analogie à laquelle je peux penser en comparant ces différents types, ou comment ces choses fonctionnent ?

De plus, que signifie l'uniformisation d'une matrice ?

109voto

Alfredo Gimenez Points 1501

Copié directement de http://www.lighthouse3d.com/tutorials/glsl-tutorial/data-types-and-variables/ . Le site actuel contient des informations beaucoup plus détaillées et vaut la peine d'être consulté.

Qualificateurs de variables

Les qualificatifs donnent une signification particulière à la variable. Ainsi, les suivants sont disponibles :

  • const - La déclaration est d'une constante de compilation.
  • attribut - Variables globales pouvant changer pour chaque vertex, transmises par l'application OpenGL aux vertex shaders. Ce qualificatif ne peut être utilisé que dans les vertex shaders. Pour le shader, il s'agit d'un variable en lecture seule. Voir la section Attribut.
  • uniform - Variables globales qui peuvent changer par primitive [...], qui sont transmises par le système OpenGL aux nuanceurs. Ce qualificatif peut être utilisé à la fois dans les vertex que dans les nuanceurs de vertex et de fragments. Pour les shaders, il s'agit d'une variable en lecture seule. Voir la section Uniformes.
  • variable - utilisé pour les données interpolées entre un vertex shader et un fragment shader. Disponible en écriture dans le vertex shader, et en en lecture seule dans un fragment shader. Voir la section Varying.

Pour faire une analogie, const et uniform sont comme des variables globales en C/C++, l'une est constante et l'autre peut être définie. Attribut est une variable qui accompagne un vertex, comme les coordonnées de couleur ou de texture. Les variables variables peuvent être modifiées par le vertex shader, mais pas par le fragment shader, donc en substance elles transmettent des informations en aval du pipeline.

106voto

neeh Points 1629
  • uniform sont per-primitif paramètres (constants pendant toute la durée d'un appel de tirage) ;
  • attribute sont par sommet paramètres (typiquement : positions, normales, couleurs, UVs, ...) ;
  • varying sont par fragment (ou par pixel ) paramètres : ils varier de pixels en pixels.

Il est important de comprendre comment varying fonctionne pour programmer vos propres shaders.
Disons que vous définissez un paramètre variable v pour chaque sommet d'un triangle à l'intérieur de la vertex shader . Lorsque ce paramètre variable est envoyé à l fragment shader sa valeur est automatiquement interpolée en fonction de la position du pixel à dessiner.

Dans l'image suivante, le pixel rouge a reçu une valeur interpolée du paramètre variable v . C'est pourquoi nous les appelons "variables".

varying parameter being bilinearly interpolated

Par souci de simplicité, l'exemple donné ci-dessus utilise interpolation bilinéaire qui suppose que tous les pixels dessinés sont à la même distance de la caméra. Pour un rendu 3D précis, les périphériques graphiques utilisent interpolation avec correction de la perspective qui tient compte de la profondeur d'un pixel.

16voto

tfmontague Points 172

Dans WebGL, quelles sont les différences entre un attribut, une variable uniforme et une variable variable ?

Dans OpenGL, un "programme" est une collection de "shaders" (petits programmes), qui sont connectés les uns aux autres dans un pipeline.

// "program" contains a shader pipeline:
//   vertex shader -> other shaders -> fragment shader
//
const program = initShaders(gl, "vertex-shader", "fragment-shader");
gl.useProgram(program);

Les shaders traitent les sommets (vertex shader), les géométries (geometry shader), la tessellation (tessellation shader), les fragments (pixel shader) et d'autres tâches de traitement par lots (compute shader) nécessaires au tramage d'un modèle 3D.

Les shaders OpenGL (WebGL) sont écrits en GLSL (un langage de shaders textuel compilé sur le GPU).

// Note: As of 2017, WebGL only supports Vertex and Fragment shaders

<!-- Vertex Shader -->
<script id="shader-vs" type="x-shader/x-vertex">

  // <-- Receive from WebGL application
  uniform vec3 vertexVariableA;

  // attribute is supported in Vertex Shader only
  attribute vec3 vertexVariableB;

  // --> Pass to Fragment Shader
  varying vec3 variableC;

</script>

<!-- Fragment Shader -->
<script id="shader-fs" type="x-shader/x-fragment">

  // <-- Receive from WebGL application
  uniform vec3 fragmentVariableA;

  // <-- Receive from Vertex Shader
  varying vec3 variableC;

</script>

En gardant ces concepts à l'esprit :

Les shaders peuvent transmettre des données au shader suivant dans le pipeline ( out , inout ), et ils peuvent également accepter des données provenant de l'application WebGL ou d'un shader précédent ( in ).

  • Les nuanceurs de sommets et de fragments (n'importe quel nuanceur en fait) peuvent utiliser un fichier de type uniform pour recevoir les données de l'application WebGL.

    // Pass data from WebGL application to shader
    const uniformHandle = gl.glGetUniformLocation(program, "vertexVariableA");
    gl.glUniformMatrix4fv(uniformHandle, 1, false, [0.1, 0.2, 0.3], 0);
  • Le Vertex Shader peut également recevoir des données de l'application WebGL avec l'option attribute qui peut être activée ou désactivée selon les besoins.

    // Pass data from WebGL application to Vertex Shader
    const attributeHandle = gl.glGetAttribLocation(mProgram, "vertexVariableB");
    gl.glEnableVertexAttribArray(attributeHandle);
    gl.glVertexAttribPointer(attributeHandle, 3, gl.FLOAT, false, 0, 0);
  • Le Vertex Shader peut transmettre des données au Fragment Shader à l'aide de la fonction varying variable. Voir le code GLSL ci-dessus ( varying vec3 variableC; ).

2voto

haolly Points 73

Les uniformes sont un autre moyen de transmettre des données de notre application sur le CPU aux shaders sur le GPU, mais les uniformes sont légèrement différents par rapport aux attributs de vertex. Tout d'abord, les uniformes sont globaux. Globale, ce qui signifie qu'une variable uniforme est unique pour chaque objet du programme de shaders et qu'elle est accessible à partir de n'importe quel shader, à n'importe quel stade du programme de shaders. Deuxièmement, quelle que soit la valeur définie pour l'uniforme, les uniformes conservent leur valeur jusqu'à ce qu'ils soient réinitialisés ou mis à jour.

J'aime la description de https://learnopengl.com/Getting-started/Shaders parce que le mot per-primitif n'est pas intuitif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X