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