2011-01-17 15 views
0

私はGLSLで基本的な頂点シェーダを作成しようとしていますが、わかりやすくするために、マトリックスを作成し、メイン以外の簡単な操作を実行する関数をいくつか追加したいと思います()ループです。しかしGLSLのシェーダと関数:エラーC1108

、私が実行しよう:

uniform float scale; 

void main() 
{ 
vec4 pos = gl_ProjectionMatrix * gl_Vertex; 
pos *= scaleMatrix(scale); 

gl_Position = pos; 

gl_TexCoord[0] = gl_MultiTexCoord0; 

gl_FrontColor = gl_Color;   
} 

mat4 scaleMatrix(const in float s) { 
return mat4(s, 0.0, 0.0, 0.0, 
      0.0, s, 0.0, 0.0, 
      0.0, 0.0, s, 0.0, 
      0.0, 0.0, 0.0, 1.0); 
} 

私はエラーを取得する:エラーC1008:未定義の変数 "scaleMatrix"。 ただし、

uniform float scale; 

void main() 
{ 
vec4 pos = gl_ProjectionMatrix * gl_Vertex; 
pos *= mat4(s, 0.0, 0.0, 0.0, 
      0.0, s, 0.0, 0.0, 
      0.0, 0.0, s, 0.0, 
      0.0, 0.0, 0.0, 1.0); 

gl_Position = pos; 

gl_TexCoord[0] = gl_MultiTexCoord0; 

gl_FrontColor = gl_Color;   
} 

はうまくいきます。誰も私のためにこれについていくつかの光を当てることができますか?

+1

シェーダでユニフォームとして渡すことのできる行列の計算を実際に行うべきではありません。良いコンパイラはそれを最適化するかもしれませんが、それでも醜いです。変化する/属性/インの影響を受けるものだけを計算することがベストプラクティスです。制服として渡すことができるものは、制服で渡されるべきです。 – datenwolf

答えて

4

コードファイルの先頭に関数宣言を配置してください。

+0

ありがとうございました!それは確かにそれを修正しました。これは私にはちょっとばかげているようですが、このようにしなければならない理由があります。 –

+0

もちろん、プロトタイプや定義を喚起の上に置く必要があります。例えば。 scaleMatrixをmain()の前にファイルの先頭に移動してください。 – EnabrenTane

+0

@Chris Robinsonええ、解析の理由からです。これがCの世界である。 – EnabrenTane

関連する問題