1

我遇到了非常奇怪的错误。我正在将一些 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 调试器中只能看到字符串的第一个字符。

4

1 回答 1

0

首先感谢@umlum的调试帮助。我设法解决了这个问题。它与多个OpenGL上下文有关。我的程序是Adobe AfterEffect(AE)中的插件。AE在运行时会随意产生自己的上下文。在我的代码中每次我渲染 OpenGL 的东西时,我都会像这样启用我的上下文(MaxOS X):

   _context = CGLGetCurrentContext() ;
    CGLSetCurrentContext(_context);

调用第一行似乎是一个严重的错误!发生的事情(可能)是,当我试图访问(据说是我的)当前上下文时,它已经不是我的上下文,而是程序独立管理的 AE 上下文之一。_context = CGLGetCurrentContext() - 我评论了这一行,它现在似乎正在工作。我通过使用想通了

glGetActiveUniform()

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

于 2013-09-08T12:47:36.623 回答