GLSL:我应该如何存储和跟踪统一/属性位置?

Roo*_*kie 10 c++ opengl glsl visual-studio-2008

目前我只是这样做:

someuniform1 = glGetUniformLocation(MyShaderName, "someuniform1");
someattribute1 = glGetAttribLocation(MyShaderName, "someattribute1");
Run Code Online (Sandbox Code Playgroud)

但是这个方法看起来很烦人,所以我想使用std :: map:

Shaders[MyShaderName].Uniforms["someuniform1"] = glGetUniformLocation(MyShaderName, "someuniform1");
Shaders[MyShaderName].Attributes["someattribute1"] = glGetAttribLocation(MyShaderName, "someattribute1");
// i could add a function to remove the repetition of the two strings at both sides.
Run Code Online (Sandbox Code Playgroud)

有没有更明智/更快的方法呢?(尽可能减少重复).

-

编辑:我正在考虑更多关于这个想法,我想,如果我只是阅读glsl源文件,解析统一/属性并自动设置到我的地图,这不是很好,我不需要写除glsl源之外的任何内容!?这是大男孩们这样做的吗?

Edit2:我现在正在成功解析GLSL着色器文件,并且使用该std::map方法,我使用单个函数调用和一个字符串参数来获取当前启用的着色器中的制服/属性的地址.如果我需要更多性能,我将缓存std::map对其他变量的调用.但我想知道我是否在这里正确的轨道...所以请,任何评论赞赏.

kva*_*ark 6

枚举着色器程序的制服GetActiveUniform,然后将它们存储在地图中.

编辑:目的.

  1. 代码中没有重复.作为常量的统一名称仅出现在您要访问它们的位置.
  2. 早期语义不匹配检查.当您从GL收集有关制服的信息时,您确切知道它所期望的值类型.因此,当传递实际值时,您可以检查客户端是否提供了正确的值的类型/大小.当OpenGL驱动程序决定"智能"时,这些检查可以为您节省大量的调试时间.

  • 为什么?不要只是告诉使用什么作为答案,"我为什么要使用"也应该是答案.我不知道这个函数与glGetUniformLocation()有什么不同,我以前从未见过它. (2认同)