2011-01-17 84 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

你不應該在着色器中真正計算你可以作爲制服傳遞的矩陣。好的編譯器可能會優化它,但它很糟糕。最好的做法是隻計算那些受變化/屬性/ in影響的東西。無論穿什麼衣服都應該穿制服。 – datenwolf

回答

4

嘗試將您的函數聲明放在代碼文件的頂部。

+0

謝謝!這確實解決了它。這對我來說似乎有點愚蠢,但我想你必須這樣做是有原因的。 –

+0

是的,你需要把原型或定義放在召喚之上。例如。將您的scaleMatrix移動到main() – EnabrenTane

+0

@Chris Robinson是,它出於解析原因之前的文件頂部。這就是C的世界。 – EnabrenTane