【问题标题】:Peculiar behavior in OpenGL concerning Vertex Shaders and input vertices on core profile 330OpenGL 中关于核心配置文件 330 上的顶点着色器和输入顶点的特殊行为
【发布时间】:2010-09-01 02:21:06
【问题描述】:

在 NVIDIA 上使用“#version 330 core”,

通过使用 glBindAttribLocation(program, 0, "in_Vertex");输入顶点与“in vec4 in_Vertex;”一起使用。但是,我注意到客户端应用程序中没有 OGL 函数调用,它仍然有效。它似乎是“默认的第一个输入变量”。为什么?它应该被省略还是通过 glBindAttribLocation 显式连接到它? [根据标准,理想是什么?] 还有“in vec4 gl_Vertex;”在规范将其称为已弃用并且着色器的编译器没有给出任何警告时工作。为什么?我本来希望它至少会发出警告。我猜最后一个问题可能是编译器(GLSL 编译器)中的错误,但第一个问题尤其令人费解。

【问题讨论】:

    标签: opengl opengl-3


    【解决方案1】:
    1. 如果您不将属性绑定到位置,GL 会为您完成。它使用的位置未指定,但您碰巧具有相同的值。

      • 您可以使用glGetAttribLocation 询问 GL 它选择了哪个位置
      • 即使没有指定,我也看到实现选择按照着色器的顺序绑定位置。第一个是 0,第二个是 1,...
    2. 标准将这两个选项保留为开放状态,因为每个选项都有有效的用例。

    3. 至于弃用,nvidia 明确表示他们认为弃用是错误的决定。最后必须有人编写代码来发出警告......所以即使他们应该发出警告,他们也不会发出警告也就不足为奇了。

    【讨论】:

    • 我可以补充一点,如果 gl_Vertex 在 NVIDIA 的 3.3 内核上工作,并不意味着它可以在其他供应商或未来的硬件上工作。如果您想要交叉兼容性,请遵循规范。
    • @Matias:是的。事实上,它应该出错,而不是警告。
    • 我不明白如何将其留给实施甚至是一种选择。如果输入顶点被赋予 var 的顺序不是通用的,那么肯定必须明确使用 glBindAttribLocation 以确保它适用于各个供应商。
    • @Lela Dax:关键是,如果你不关心它在哪里,你可以询问它是在哪里设置的,并在你的代码中使用它。有点像纹理句柄:glGenTextures 不会在每个实现中返回相同的句柄。您仍然使用它的结果来测试纹理对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2023-04-01
    • 2021-09-22
    • 2015-01-13
    相关资源
    最近更新 更多