2013-05-19 65 views
7

问题:

我学习的OpenGLhttp://www.arcsynthesis.org/gltut/index.html教程中,我有很艰难的时期越来越教程13:几何冒名顶替工作(6+小时),现在是在代码实际上应该没有任何操作的情况下进行一些非常小的修改后工作,我需要您的帮助以了解它为什么会改变任何内容。GLSL,接口模块

说明 - 编辑:

的问题是与不变的代码片段着色器没有从几何着色器得到正确的输入,但无论是更换几何着色器的出接口块分离变量或给该块的实例名称使程序正常工作。但是这些改变应该是无效的。

问题可能是名称冲突。

喜欢这个不起作用:

in VertexData 
{ 
    vec3 cameraSpherePos; 
    float sphereRadius; 
} vert[]; 

out FragData 
{ 
    flat vec3 cameraSpherePos; 
    flat float sphereRadius; 
    smooth vec2 mapping; 
}; 

void main() 
{ 
    mapping = 
    cameraSpherePos = 
    sphereRadius = 
    EmitVertex(); 
    /* mapping's value doesn't get to the fragment shader correctly */ 
} 

但无论给FragData实例名称一样的frag,并使用映射frag.mappaing instad,或使用3个​​独立的变量解决了这个问题。

为什么没有实例名称就无法工作?

编辑:这似乎是一个驱动程序问题。

+0

你在运行什么硬件? –

+0

程序正在运行#verison 330: Geforce GTS 360M - “3.30 NVIDIA via Cg compiler” – IceCool

+0

嗯,更多着色器和C++代码将有助于给出更准确的答案。在您的gs着色器中,在调用EmitVertex()之前,您正在初始化/设置每个顶点迭代的FragData的每个成员。此外,如果您有多个调用 - 请确保您已将FragData设置为正确。 – dinony

回答

2

像所有接口块创建实例名称:

FragData { // .. } gs2fs; 

然后:

gs2fs.cameraCornerPos = vec4(vert[0].cameraSpherePos, 1.0); 
2

由于讨厌的版本问题,使用GLSL样本往往变得单调乏味。

一些一般性的调试建议:

  • 验证是否包含在着色代码
  • 正确的版本标签验证你的OpenGL驱动程序实际上支持该版本通过调用glGetString(GL_SHADING_LANGUAGE_VERSION)
  • 创建运行着色器的方式 - 重新编译(例如,通过将其分配给关键事件)
  • 和FOREMOST:使用glGetShaderInfoLog()glGetProgramInfoLog()
+0

我为我的程序使用了#version 330,这是我的GPU支持的。 其实我在C编程不是C,所以我使用的功能,如果编译/链接不成功,引发一个异常与日志消息作为什么()。这使得代码更容易阅读+我不必创建“char logbuffer [2000]”;只是为了能够调用信息功能。 – IceCool

+0

多个中间层不会帮助你隔离这个bug,我怀疑人们会过分倾向于构建一个框架,只是为了帮助你。因此,请尝试构建一个MINIMAL示例,使用我告诉您的GLSL调试措施重现假定的“错误”。 – Solkar

1

这个问题实际上是与没有使用最新的驱动程序。

我在linux上运行这个程序,并从Ubuntu的包管理器中获得了最新的驱动程序:Nvidia 310-experimental。但即使它的实验,它是相当古老。从nvidia网站手动安装319的代码工作正常,没有任何改变。

这个故事的寓意:

总是使用最新的驱动程序。