似乎每个人都同意这已损坏,并且您需要摆脱GLKBaseEffect才能阻止它泄漏。但是没有人提及您将要替换的内容。

有人可以指出正确的方向吗?一些示例代码或教程将非常有用!

我正在做非常基本的事情,只是绘制2D精灵。除了所有泄漏外,效果很好:p

我只需要知道prepareToDraw在做什么,并用一些有效的代码替换它即可。我发现的所有教程似乎都专注于3D渲染...

我可以使用OpenGL ES1代替2吗?

//---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);

最佳答案

所以...最后,我做了其他人必须做的事情,并编写了自己的GLKBaseEffect版本。

这很有趣,但并不困难,花了大约一天的时间。有一些教程,但没有一个提供我所需要的。最后,我以OGL默认项目为起点,这为我提供了框架-编译和运行着色器以及所有这些,即使它没有满足我的要求。

这是我所做的要点。花了很多次迭代才能开始工作...

  • 从默认OGL项目中删除所有GLKBaseEffect(使用GLKBaseEffect绘制一个立方体,而另一个使用着色器绘制)
  • 将投影矩阵更改为GLKMatrix4MakeOrtho。
  • 将顶点从“多维数据集”更改为2D。使它工作。
  • 添加纹理。
  • 一切正常。
  • 将所有OGL代码移到OpenGLHelper类中。
  • 将代码移到我的项目中,并将所有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;
    }
    

    我很乐意分享其余的代码,但是这里有很多内容!

    10-08 15:45