2016-05-04 3 views
2

Emscritenを使用してOpenGLフレームワークをJavaScriptに移植します。WebGL:頂点シェーダーとフラグメントシェーダーで同じ制服をバインドすることは禁じられていますか?

状態は、均一な構造体に格納されます。私は、頂点及びフラグメントシェーダの両方にアクセスしたい

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

uniform UniformState GLUP; 

私はそれを行う際に、Iリンク時にエラーが発生する:

Uniform `GLUP`is not linkable between attached shaders 

頂点シェーダーとフラグメントシェーダーで同じユニフォームをバインドすることは禁じられていますか?

(これが禁止されていれば、シェーダごとに異なる2組の一様変数を宣言することができますが、コードがクリーナー/シンプルになるので、1つしか持たないことを望みます。その場合には が可能にするために特別なものです)。

+0

が、私はこれをやったので、久しぶり取得精度を設定しない場合はレトが述べたように。私はあなたが頂点シェーダからフラグメントシェーダにユニフォームを渡すことができると思う – user3125280

+0

その設定を統一し、位置を取り出してdrawcallに送るコードを表示してください。それを間違った方法で送ることが問題になるかもしれないと思う。どのようにしても、他のすべてが失敗した場合、頂点シェーダから一様な値を出力してフラグメントシェーダ(varを変更)に入力できます。 –

+0

このエラーはシェーダリンク時に発生するため、均一な位置を取得してユニフォームを指定する方法(これは後で行います)によって発生することはありません。 – BrunoLevy

答えて

1

私のために働くようです。

注私はリンクエラー

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

関連する問題