GLSL顶点着色器编译无误但没有显示

3

我正在尝试实现冯氏着色,但一直没有成功。我正在逐步构建着色器(这本身可能是一个问题),但目前的情况如下。我希望这个代码可以将我的结果(犹他茶壶)输出为黑色背景上的白色图像。当我从顶点着色器中删除第18行时,它可以正确地输出结果,但当该行存在时,就没有任何输出和错误。有什么想法吗?

片段着色器:

  1 #version 120                                                                                      
  2                                                                                                   
  3 varying vec3 vertexNormal;                                                                        
  4 varying vec3 cameraSpacePos;                                                                      
  5                                                                                                   
  6 vec3 calcSpecular(vec3 l, vec3 n, vec3 v, vec3 cL, vec3 cS, float p)                              
  7 {                                                                                                 
  8     vec3 r =  2.0 * n * (n * l) - l;                                                              
  9     return cL * cS * pow(max(0.0, dot(r, v)), p);                                                 
 10 }                                                                                                 
 11                                                                                                   
 12 vec3 calcDiffuse(vec3 l, vec3 n, vec3 cL, vec3 cD)                                                
 13 {                                                                                                 
 14     return cL * cD * max(0.0, dot(n, l));                                                         
 15 }                                                                                                 
 16                                                                                                   
 17 void main(void)                                                                                   
 18 {                                                                                                 
 19     vec3 lightDirection = normalize(vec3(-1.0, 0.0, -1.0));                                       
 20     vec3 objectColor    = vec3(0.5, 0.0, 0.0);                                                    
 21     vec3 ambientColor   = vec3(0.1, 0.1, 0.1);                                                    
 22     vec3 lightColor     = vec3(0.3, 0.0, 0.3);                                                    
 23     vec3 specularColor  = vec3(1.0, 1.0, 1.0);                                                    
 24                                                                                                   
 25     gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);                                                      
 26 }                   

顶点着色器:

  1 #version 120
  2 
  3 uniform mat4 modelView;
  4 uniform mat4 normalModelView;
  5 uniform mat4 projection;
  6 
  7 attribute vec3 position;
  8 attribute vec3 normal;
  9 
 10 varying vec3 vertexNormal;
 11 varying vec3 cameraSpacePos;
 12 
 13 void main(void)
 14 {
 15     vec4 tmpCameraSpacePos = modelView * vec4(position, 1.0);
 16     gl_Position    = projection * tmpCameraSpacePos;
 17 
 18     vertexNormal = (normalModelView * vec4(normal, 0.0)).xyz;
 19     cameraSpacePos  = (tmpCameraSpacePos).xyz;
 20 
 21 }
 22

值得一提的是,normal和normalModelView目前没有被设置。之前我尝试启用它们,但结果类似。我的理解是它们应该设置为默认值。


在第18行,你应该将w设置为0.0还是1.0? - user1118321
1
@user1118321 一个法向量是一个向量,因此平移不适用于它,它应该具有值0。 - kevintodisco
值得一提的是,解决方案文件中的.frag'和.vert'文件即使存在语法错误等问题也会始终被编译。VS假定它们是正确的,无论它们是否显示任何内容都取决于它们是否实际上是正确的。看起来你已经解决了这个问题:D - Reanimation
1个回答

2

由于您提到normalnormalModelView没有被设置,我猜测它们也没有被设置为默认值,因此属于无效数据。当着色器使用无效数据时,结果是未定义的,这也是为什么调试着色器很困难的一部分原因。在尝试在代码中引用这些变量之前,请确保为这些变量提供了值。


没错,那就是问题所在。我之前以为行为已经被定义好了(至少对于矩阵来说),但最终证明那正是问题所在。 - Kyle
你给了我一个灵感,帮助我在调试GLSL时突破另一个问题,这个问题让我遇到了黑屏但没有错误提示,谢谢 :)顺便说一下,这个想法是:对所有处理的片段输出白色,并从那里开始逆推,看看哪里出了问题。 - xalpha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接