所有统一位置在MacOS X上均为“-1”

所有统一位置在MacOS X上均为“-1”,macos,opengl,glsl,after-effects,Macos,Opengl,Glsl,After Effects,我遇到了非常奇怪的错误。我正在将一些OpenGL代码库移植到MacOS X 10.7.5。OpenGL代码适用于GL3.2版本。Windows/Linux上的原始版本工作正常。GLSL或OpenGL方面没有错误。但是在Mac上,当尝试访问制服时,所有位置都是-1。在这里列出整个代码是有问题的,因为它被包装到框架中。我也相信它100%是正确的,因为它在其他平台上进行了大量测试,但这里有一些GLSL代码: #version 150 core uniform sampler2D tex; unif

我遇到了非常奇怪的错误。我正在将一些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");
返回右侧的位置


但如果我将位置名作为param const GLchar*name传递,我在XCode调试器中只能看到字符串的第一个字符。

首先感谢@umlum提供的调试帮助。我设法解决了这个问题。这与多个OpenGL上下文有关。我的程序是Adobe AfterEffectAE.AE中的插件,在运行时会随意生成自己的上下文。在我的代码中,每次渲染OpenGL内容时,我都会启用上下文就像这个MaxOS X:

   _context = CGLGetCurrentContext() ;
    CGLSetCurrentContext(_context);
打第一个电话似乎是个严重的错误!可能发生的情况是,当我试图访问假定的我的当前上下文时,它已经不是我的上下文,而是程序独立管理的AE上下文之一。 _context=CGLGetCurrentContext-我对这一行进行了注释,它现在似乎正在工作。 我通过使用

glGetActiveUniform()

运行它时,我发现我的着色器程序包含的名称并不一致。因此,很明显,我的程序句柄可能引用了来自不同上下文的程序。

关于更新:如果字符串相等,strcmp的计算结果为0 false。您是否从操作系统请求了3.2渲染上下文?使用glGetIntegerv GL_主版本检查(&M);和glGetIntegerv GL_次要版本&MINOR@哎呀。是的,请求了3.2 core,并且随着着色器程序的编译和链接而启动。但是为什么直接传递名称字符串时我会获得有效位置?它在其他平台上正常工作并不意味着您的代码是正确的,也可能是您,例如,驱动程序/卡对代码的要求不那么严格。我经常看到core 3.2中的OS X驱动程序比Windows上的NVIDIA驱动程序更严格。您是否检查了GLGetShaderingFolog和glGetProgramInfoLog的输出?你用glValidateProgram检查了最终的程序是否有效吗?是的,你说得对。下面是验证引发的结果:当前绘图帧缓冲区无效。为什么?我在渲染的后期创建了自定义FBO,但它是如何连接到程序验证的?