WebGL:是否禁止在顶点着色器和片段着色器中绑定相同的制服?
WebGL: Is it forbidden to bind the same uniform in a vertex shader and fragment shader?
我正在使用 Emscriten 将 OpenGL 框架移植到 JavaScript。
状态存储在一个统一的结构中:
struct UniformState {
...
mat4 modelviewprojection_matrix;
mat4 modelview_matrix;
mat3 normal_matrix;
mat4 texture_matrix;
...
};
我想在顶点和片段着色器中访问为:
uniform UniformState GLUP;
当我这样做时,我在 link 时收到错误消息:
Uniform `GLUP`is not linkable between attached shaders
是否禁止在顶点着色器和片段着色器中绑定相同的制服?
(如果它被禁止,那么显然我可以为每个着色器声明两组不同的统一变量,但我宁愿只有一组,因为它使代码更清晰/更简单,这就是为什么我'我问万一有
是为了让它成为可能而做的一些特别的事情。
似乎对我有用。
如 Reto 所述,如果我不设置精度,我会收到 link 错误
"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);
}
<script id="vs" type="notjs">
struct Test {
vec4 color;
vec4 mult;
};
uniform Test test;
attribute vec4 position;
void main() {
gl_Position = position * test.mult;
}
</script>
<script id="fs" type="notjs">
precision highp float;
struct Test {
vec4 color;
vec4 mult;
};
uniform Test test;
void main() {
gl_FragColor = test.color;
}
</script>
<script src="https://twgljs.org/dist/twgl.min.js"></script>
我正在使用 Emscriten 将 OpenGL 框架移植到 JavaScript。
状态存储在一个统一的结构中:
struct UniformState {
...
mat4 modelviewprojection_matrix;
mat4 modelview_matrix;
mat3 normal_matrix;
mat4 texture_matrix;
...
};
我想在顶点和片段着色器中访问为:
uniform UniformState GLUP;
当我这样做时,我在 link 时收到错误消息:
Uniform `GLUP`is not linkable between attached shaders
是否禁止在顶点着色器和片段着色器中绑定相同的制服?
(如果它被禁止,那么显然我可以为每个着色器声明两组不同的统一变量,但我宁愿只有一组,因为它使代码更清晰/更简单,这就是为什么我'我问万一有 是为了让它成为可能而做的一些特别的事情。
似乎对我有用。
如 Reto 所述,如果我不设置精度,我会收到 link 错误
"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);
}
<script id="vs" type="notjs">
struct Test {
vec4 color;
vec4 mult;
};
uniform Test test;
attribute vec4 position;
void main() {
gl_Position = position * test.mult;
}
</script>
<script id="fs" type="notjs">
precision highp float;
struct Test {
vec4 color;
vec4 mult;
};
uniform Test test;
void main() {
gl_FragColor = test.color;
}
</script>
<script src="https://twgljs.org/dist/twgl.min.js"></script>