0

iOS 用に作成した単純な OpenGL ES 2.0 レンダラーを OS X デスクトップに移植しようとしていますが、「レンダリングが何もない」という問題が発生し、エラーが報告されないので途方に暮れています何をすべきか。これまでのところ、問題を への呼び出しに絞り込みましたがglVertexAttrib4f、これは OS X でのみ機能します。次のコードを見て、glVertexAttrib4fデスクトップで への呼び出しが機能しない理由を理解できる人はいますか?:

void Renderer::drawTest()
{
    gl::clear( mBackgroundColor );

    static Vec2f vertices[3] = { Vec2f( 0, 0 ), Vec2f( 0.5, 1 ), Vec2f( 1, 0 ) };
    static int indices[3] = { 0, 1, 2 };

    mShader.bind();

    glEnableVertexAttribArray( mAttributes.position );
    glVertexAttribPointer( mAttributes.position, 2, GL_FLOAT, GL_FALSE, 0, &vertices[0] );

#ifdef USING_GENERIC_ARRAY_POINTER
    // works in iOS /w ES2 and OSX:
    static Color colors[3] = { Color( 0, 0, 1 ), Color( 0, 0, 1 ), Color( 0, 0, 1 ) };
    glEnableVertexAttribArray( mAttributes.color );
    glVertexAttribPointer( mAttributes.color, 3, GL_FLOAT, GL_FALSE, 0, &colors[0] );
#else // using generic attribute
    // works in iOS, but doesn't work in OSX ?:
    glVertexAttrib4f( mAttributes.color, 0, 1, 1, 1 );
#endif

    glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, &indices[0] );

    errorCheck(); // calls glGetError, which always returns GL_NO_ERROR
}

注: これは、より複雑なものから取り除いたサンプル コードです。完全なものにしないことをお許しください。

バージョン: デスクトップ OS X は 2.1 ATI-7.18.18 iPhone シミュレーターは OpenGL ES 2.0 APPLE

4

2 に答える 2

1

この問題は、NVidia GeForce GTX 680MX を搭載した OS X 10.1 を実行している iMac の Apple の GLUT_3_2_CORE_PROFILE で持続します。

最も簡単な解決策は、rich.e が提案したとおりに実行し、明示的に位置を 0 にバインドすることでした。私のシェーダーでは、位置は と呼ばれvPosition、教科書の関数 InitShader を使用して、シェーダーをロード、コンパイル、およびリンクします。位置はリンクで再バインドされる可能性があるため、このコードを変更します。

GLuint program = InitShader( "vshader.glsl", "fshader.glsl" );
glUseProgram( program );

これに:

GLuint program = InitShader( "vshader.glsl", "fshader.glsl" );
glBindAttribLocation(program, 0, "vPosition");
glLinkProgram(program);
glUseProgram( program );

私の問題を解決しました。

于 2015-01-09T00:21:47.493 に答える
1

呼び出し中に描画が行われなかった理由glVertexAttrib4fは、mAttributes.color自動的にロケーション 0 にバインドされていたためです。を呼び出しませんでしglBindAttribLocationたが、代わりに、リンク中に元の境界値に依存していました。どうやら GL 互換性コンテキスト (OS X の 2.1) では、場所 0 で境界が設定されている属性が「有効」でない場合、つまり呼び出した場合、glDrawElements は何も描画しない場合がありますglEnableVertexAttribArray

したがって、位置を 0 に、色を 1 に明示的にバインドすると、color 属性で glVertexAttrib*() を呼び出すことができ、OS X (レガシー) と ES 2 の両方で問題なく描画されます。

于 2012-06-11T07:11:32.123 に答える