菜鸟教程小白 发表于 2022-12-13 01:07:53

ios - 在多个对象上渲染多个纹理的问题


                                            <p><p>我正在尝试渲染两个对象 <code>- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect</code> 方法,并且我正在尝试为这两个对象绑定(bind)单独的纹理。 </p>

<p>对于第一个对象,以下是纹理绑定(bind)代码</p>

<pre><code>/************* texture binding for object 1 ****************/
glActiveTexture(GL_TEXTURE0);
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                   _videoTextureCache,
                                                   pixelBuffer,
                                                   NULL,
                                                   GL_TEXTURE_2D,
                                                   GL_RED_EXT,
                                                   _textureWidth,
                                                   _textureHeight,
                                                   GL_RED_EXT,
                                                   GL_UNSIGNED_BYTE,
                                                   0,
                                                   &amp;_lumaTexture);
if (err)
{
    NSLog(@&#34;Error at CVOpenGLESTextureCacheCreateTextureFromImage %d&#34;, err);
}   

glBindTexture(CVOpenGLESTextureGetTarget(_lumaTexture), CVOpenGLESTextureGetName(_lumaTexture));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glActiveTexture(GL_TEXTURE1);
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                   _videoTextureCache,
                                                   pixelBuffer,
                                                   NULL,
                                                   GL_TEXTURE_2D,
                                                   GL_RG_EXT,
                                                   _textureWidth/2,
                                                   _textureHeight/2,
                                                   GL_RG_EXT,
                                                   GL_UNSIGNED_BYTE,
                                                   1,
                                                   &amp;_chromaTexture);
if (err)
{
    NSLog(@&#34;Error at CVOpenGLESTextureCacheCreateTextureFromImage %d&#34;, err);
}

glBindTexture(CVOpenGLESTextureGetTarget(_chromaTexture), CVOpenGLESTextureGetName(_chromaTexture));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

/************* rendering first object ****************/
;

/************* texture binding for object 2 ****************/
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _texture1);

/************* rendering second object ****************/
;
</code></pre>

<p>现在第一个对象的纹理受到干扰,而第二个对象得到正确的纹理绑定(bind)。</p>

<p>加载_texture1的代码(在 ViewController 启动时执行一次)如下</p>

<pre><code>NSDictionary* options = @{ : GLKTextureLoaderOriginBottomLeft};

NSError* error;
NSString* path = [ pathForResource:fileName ofType:nil];
GLKTextureInfo* texture = ;
if(texture == nil)
    NSLog(@&#34;Error loading file: %@&#34;, );
_texture1 = texture.name;
glUseProgram(_program1);
glBindTexture(GL_TEXTURE_2D, _texture1);
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我通过在渲染第二个对象后再次为第一个对象设置纹理解决了这个问题。检查下面的更新代码。</p> <pre><code>/************* texture binding for object 1 ****************/
    glActiveTexture(GL_TEXTURE0);
    err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                       _videoTextureCache,
                                                       pixelBuffer,
                                                       NULL,
                                                       GL_TEXTURE_2D,
                                                       GL_RED_EXT,
                                                       _textureWidth,
                                                       _textureHeight,
                                                       GL_RED_EXT,
                                                       GL_UNSIGNED_BYTE,
                                                       0,
                                                       &amp;_lumaTexture);
    if (err)
    {
      NSLog(@&#34;Error at CVOpenGLESTextureCacheCreateTextureFromImage %d&#34;, err);
    }

    glBindTexture(CVOpenGLESTextureGetTarget(_lumaTexture), CVOpenGLESTextureGetName(_lumaTexture));
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glActiveTexture(GL_TEXTURE1);
    err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                       _videoTextureCache,
                                                       pixelBuffer,
                                                       NULL,
                                                       GL_TEXTURE_2D,
                                                       GL_RG_EXT,
                                                       _textureWidth/2,
                                                       _textureHeight/2,
                                                       GL_RG_EXT,
                                                       GL_UNSIGNED_BYTE,
                                                       1,
                                                       &amp;_chromaTexture);
    if (err)
    {
      NSLog(@&#34;Error at CVOpenGLESTextureCacheCreateTextureFromImage %d&#34;, err);
    }

    glBindTexture(CVOpenGLESTextureGetTarget(_chromaTexture), CVOpenGLESTextureGetName(_chromaTexture));
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    /************* rendering first object ****************/
    ;

    /************* texture binding for object 2 ****************/
    glEnable(GL_TEXTURE_2D);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, _texture1);

    /************* rendering second object ****************/
    ;


    /************* re-binding texture for object 1 ****************/
    glBindTexture(CVOpenGLESTextureGetTarget(_lumaTexture), CVOpenGLESTextureGetName(_lumaTexture));
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在多个对象上渲染多个纹理的问题,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25443159/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25443159/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在多个对象上渲染多个纹理的问题