我遇到了非常奇怪的错误。我正在将一些OpenGL代码库移植到MacOS X 10.7.5 OpenGL代码适用于GL3.2版本。原始版本(在Windows / Linux上)工作正常。没有GLSL中的错误或OpenGL方面。但是在Mac上,当试图访问制服时,所有位置都是“-1”。在这里将整个代码放入框架中是非常有问题的(同时我确信它是100%正确编写为它在很大程度上在其他平台上进行了测试),但这里有一些GLSL代码:
#version 150 core
uniform sampler2D tex;
uniform vec2 dir;
uniform float cont;
noperspective in vec2 uv;
out vec4 colorOut;
void main(){
...
着色器正在使用所有制服,因此GLSLcompiler不太可能优化它们。
更新
好的,我在确定问题方面取得了一些进展。某种方式,似乎字符串,我传递给检索统一位置的方法,被截断。这是测试:
明确致电:
GLuint loc1 = glGetUniformLocation(shaderEmboss->getHandle(), "dir");
返回右边的位置。
但是如果我将位置名称作为参数“const GLchar * name”传递,我可以在XCode调试器中看到该字符串的第一个字符。
答案 0 :(得分:0)
首先感谢@umlum的调试帮助。我设法解决了这个问题。它与多个OpenGL上下文有关。我的程序是Adobe AfterEffect(AE)插件。在运行时运行自己的上下文。在我的代码中每次渲染OpenGL时我都会启用我的上下文(MaxOS X):
_context = CGLGetCurrentContext() ;
CGLSetCurrentContext(_context);
调用第一行似乎是一个严重的错误!当我尝试访问(据称是我的)当前上下文时,会发生什么事情,它已经不是我的上下文了,而是程序中的AE上下文之一独立管理。 _context = CGLGetCurrentContext() - 我评论了这一行,它现在似乎正在起作用。 我通过使用
来解决这个问题glGetActiveUniform()
运行它我发现我的着色器程序包含它实际上没有的统一名称。所以很明显我的程序的句柄可能引用了来自不同上下文的程序。