1

私は本当に奇妙なバグに遭遇しています。いくつかの OpenGL コードベースを MacOS X 10.7.5 に移植しています。OpenGL コードは GL3.2 バージョンに適しています。元のバージョン (Windows/Linux" 上) は正常に動作します。GLSL または OpenGL 側にエラーはありません。しかし、Mac では、uniforms にアクセスしようとすると、すべての場所が「-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 デバッガーで文字列の最初の文字だけを確認できます。

4

1 に答える 1

0

最初に @umlum のデバッグ ヘルプに感謝します。問題を突き止めることができました。複数の OpenGL コンテキストに関係しています。私のプログラムは Adob​​e AfterEffect(AE) のプラグインです。AE は実行時に独自のコンテキストを自由に生成します。 OpenGL のものをレンダリングするたびに、次のようにコンテキストを有効にしていました (MaxOS X):

   _context = CGLGetCurrentContext() ;
    CGLSetCurrentContext(_context);

最初の行を呼び出すのは重大な間違いのようです!何が起こるか (おそらく)、(おそらく私の)現在のコンテキストにアクセスしようとすると、それはすでに私のコンテキストではなく、プログラムが独立して管理する AE コンテキストの 1 つです。_context = CGLGetCurrentContext() - この行にコメントを付けましたが、現在は機能しているようです。私はそれをすべて使用して理解しました

glGetActiveUniform()

実行すると、シェーダー プログラムに、実際には存在しない統一された名前が含まれていることがわかりました。そのため、プログラムのハンドルがおそらく異なるコンテキストのプログラムを参照していることが明らかになりました。

于 2013-09-08T12:47:36.623 に答える