7

问题:

我正在从http://www.arcsynthesis.org/gltut/index.html教程中学习OpenGL,我真的很难获得教程 13:几何冒名顶替者工作(6 小时以上),现在它真的在工作代码中的微小变化实际上应该是无操作的,我需要你的帮助来找出它为什么会改变任何东西。

解释 - 编辑:

问题在于,在代码未更改的情况下,片段着色器没有从几何着色器获得正确的输入,但是通过将几何着色器的输出接口块替换为单独的变量或给块一个实例名称,程序可以正常工作。但是这些更改应该是无效的。

问题可能是名称冲突。

像这样它不起作用:

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 个单独的变量来解决问题。

为什么没有实例名称就不能工作?

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

4

3 回答 3

2

由于讨厌的版本问题,使用 GLSL 示例通常会变得乏味。

一些一般调试建议:

  • 验证您是否在着色器源中包含了正确的版本标签
  • 通过调用验证您的 OpenGL 驱动程序实际上支持该版本glGetString(GL_SHADING_LANGUAGE_VERSION)
  • 创建运行时着色器重新编译的方法(例如,通过将其分配给关键事件)
  • 最重要的是:使用glGetShaderInfoLog()glGetProgramInfoLog()
于 2013-05-20T05:11:23.850 回答
2

为所有接口块创建实例名称,例如:

FragData { /* ... */ } gs2fs; 

进而:

gs2fs.cameraCornerPos = vec4(vert[0].cameraSpherePos, 1.0);
于 2013-05-20T16:04:51.603 回答
2

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

我在 linux 上运行它,并从 Ubuntu 的包管理器中获得了最新的驱动程序:Nvidia 310-experimental。但即使它是实验性的,它也相当古老。通过从 nvidia 的站点手动安装 319,代码可以正常工作,无需任何更改。

故事的道德启示:

始终使用最新的驱动程序。

于 2013-05-21T12:49:50.253 回答