2

誰もがこれが壊れていることに同意しているようで、リークを止めるには GLKBaseEffect を取り除く必要があります。しかし、それを何に置き換えるかについては誰も言及していません。

誰かが私を正しい方向に向けることができますか? いくつかのサンプル コードまたはチュートリアルは非常に役立ちます。

2D スプライトを描画するだけで、非常に基本的なことを行っています。すべてのリークを除けば、うまく機能します:p

prepareToDraw が何をしているかを知り、それを機能するコードに置き換えるだけです。私が見つけたすべてのチュートリアルは、3D レンダリングに焦点を当てているようです...

おそらく2の代わりにOpenGL ES1を使用できますか?

//---Sprite drawing code ----------------------

effect.transform.modelviewMatrix = viewMatrix;

effect.texture2d0.name = textureInfo.name;
effect.texture2d0.envMode = GLKTextureEnvModeReplace;

// LEAK Here
[effect prepareToDraw];

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, vertices);

glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, textureVerts);

glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

glDisableVertexAttribArray(GLKVertexAttribPosition);
glDisableVertexAttribArray(GLKVertexAttribTexCoord0);

glDisable(GL_BLEND);
4

2 に答える 2

2

だから...結局、私は他の人がしなければならなかったことをして、GLKBaseEffectの独自のバージョンを書きました。

面倒ですが、それほど難しくはありません。約1日かかりました。そこにはチュートリアルがありますが、私が必要としていたものを正確に提供するものはありませんでした. 最終的に、OGL のデフォルト プロジェクトを出発点として使用しました。これにより、フレームワークが得られました。つまり、シェーダーのコンパイルと実行など、すべてが必要な動作をしていませんでした。

これが私がやったことの要点です。機能するようになるまでには多くの反復が必要でした...

  1. デフォルトの OGL プロジェクトからすべての GLKBaseEffect を削除します (1 つの立方体は GLKBaseEffect で描画され、もう 1 つの立方体はシェーダーで描画されます)。
  2. プロジェクション マトリックスを GLKMatrix4MakeOrtho に変更します。
  3. 頂点を立方体から 2D に変更します。それを機能させます。
  4. テクスチャを追加します。
  5. すべてを機能させます。
  6. すべての OGL コードを OpenGLHelper クラスに移動します。
  7. コードをプロジェクトに移動し、すべての GLKEffects を新しいクラスに置き換えます

最終結果は最良のコードではないかもしれませんが、機能し、リークはもうありません。

ここに私のシェーダーがあります

// FRAGMENT SHADER //////////////

precision mediump float;
varying lowp vec2 texCoordOut; 
uniform sampler2D textureUniform; 
uniform float     alphaUniform;
uniform lowp vec4 colorUniform;

void main()
{
    vec4 color  = colorUniform * texture2D(textureUniform, texCoordOut); ;
    gl_FragColor = color; 
}

// VERTEX SHADER ////////////////////

attribute vec4 position;
uniform mat4 projection;
uniform mat4 modelView;

attribute vec2 texCoordIn; 
varying vec2 texCoordOut; 

void main()
{
    gl_Position = projection * modelView * position;
    texCoordOut = texCoordIn; 
}

喜んで残りのコードを共有したいと思いますが、ここに入れるには少し多くのコードがあります!

于 2012-07-25T04:37:57.993 に答える
1

あなたの質問とは直接関係ありませんが、同様の問題が発生しました。大変だったのは、何が漏れているのかを突き止めることでした。

テクスチャを使用しているようです。それ以外の場合は、リークglDeleteTexturesの各更新を呼び出す必要があります。textureInfo

この関連記事も参照してください: GLKTextureLoader によって割り当てられたテクスチャ (GLKTextureInfo オブジェクト) を解放する

于 2012-07-23T15:33:38.850 に答える