2 votes

WebGL : Est-il interdit de lier le même uniforme dans un shader de sommets et un shader de fragments ?

Je suis en train de porter un framework OpenGL en JavaScript en utilisant Emscriten.

L'état est stocké dans une structure uniforme:

struct UniformState {
    ...
    mat4 modelviewprojection_matrix; 
    mat4 modelview_matrix;
    mat3 normal_matrix; 
    mat4 texture_matrix;
    ...
};

que j'aimerais accéder à la fois dans les shaders de sommets et de fragments comme suit:

uniform UniformState GLUP;

lorsque je fais cela, j'obtiens une erreur au moment du lien:

Uniform `GLUP`is not linkable between attached shaders

Est-il interdit de lier le même uniforme dans le shader de sommets et le shader de fragments ?

(si c'est interdit, alors clairement je peux déclarer deux ensembles différents de variables uniformes pour chaque shader, mais je préférerais n'en avoir qu'un seul, car cela rend le code plus propre / plus simple, c'est pourquoi je demande au cas où il y aurait quelque chose de spécial à faire pour rendre cela possible).

1voto

gman Points 9074

Semble fonctionner pour moi.

Notez comme l'a mentionné Reto si je ne définis pas la précision, j'obtiens une erreur de lien

"use strict";
var gl = document.createElement("canvas").getContext("webgl");
var program = twgl.createProgramFromScripts(gl, ["vs", "fs"], [], [], log);
log("--done--");

function log(msg) {
  var elem = document.createElement("pre");
  elem.appendChild(document.createTextNode(msg));
  document.body.appendChild(elem);
}

struct Test {
  vec4 color;
  vec4 mult;
};

uniform Test test;

attribute vec4 position;

void main() {
  gl_Position = position * test.mult;
}

precision highp float;

struct Test {
  vec4 color;
  vec4 mult;
};

uniform Test test;

void main() {
  gl_FragColor = test.color;
  }

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