簡體   English   中英

iPhone上的OpenGL ES的glBindTexture問題

[英]glBindTexture Problem with OpenGL ES on iPhone

我是OpenGL的新手,我的紋理有一個奇怪的問題-尋找正確方向的微調。

我有一個使用Render to Texture技術來實現某種效果的應用程序-它的工作非常出色。 每次需要時,我都會繪制到屏幕外緩沖區,並且能夠將其用作渲染循環中的紋理。

僅在必要時才更新此紋理-與大多數幀一樣,它會被繪制到屏幕上。

我有一些工具欄,這些工具欄也使用OpenGL繪制,在該表面的頂部使用紋理圖集並使用混合繪制。

我最近開始嘗試將粒子系統合並到應用程序中,但是每當我嘗試渲染粒子系統圖形時,我都會“丟失”第一步中渲染的紋理,即其內容消失了。

我將其追溯到對綁定粒子紋理的glBindTexture的調用。

編輯:我可以在下面的簡單工具欄繪制例程中重現此代碼。 這是一個粗略的例程,可在屏幕上和屏幕外對工具欄圖形進行動畫處理。

當取消注釋drawToolBar()的前兩行時,我在內存中渲染的紋理消失了,即,我的render循環中的drawarrays調用不向屏幕渲染任何內容。 通過測試,我確定了觸發glBidTexture的原因。 (例如,我可以在紋理上渲染彩色四邊形,而不能渲染紋理四邊形)

但是,如果我允許drawToolbar()如下運行,一切都很好-唯一的區別是對drawTools()的最終調用包裝在glPush / Pop中並進行了翻譯。

請注意,工具欄渲染始終有效-這里發生了一些意外的副作用,后果或錯誤問題,這導致我的背景紋理消失了。

歡迎任何想法-這真讓我發瘋。

編碼:

void drawTools()
{   
//*Texture Coordinate Stuff Snipped*//

glBindTexture(GL_TEXTURE_2D, _buttontexture);

glEnable(GL_TEXTURE_2D);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer  (2, GL_FLOAT, 0,bottomToolQuads);
glTexCoordPointer(2, GL_FLOAT, 0,texc);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 12, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 16, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 20, 4);

glDisable(GL_TEXTURE_2D);

}

void drawToolBar()

{

//drawTools();
//return;

if(_toolbarState ==0)
{
    drawTools();
}
else if(_toolbarState == 2)//hiding
{
    _toolbarVisiblePct -= TOOLINC;

    if(_toolbarVisiblePct <= 0.0)
    {
        _toolbarState = 1;
        _toolbarVisiblePct = 0.0;
    }
    else
    {
        glPushMatrix();
        glTranslatef(0.0, -(1-_toolbarVisiblePct) * 50, 0);
        drawTools();
        glPopMatrix();
    }
}
else if(_toolbarState == 3) //showing
{
    _toolbarVisiblePct += TOOLINC;
    if(_toolbarVisiblePct >= 1.0)
    {
        _toolbarState = 0;
        _toolbarVisiblePct = 1.0;
        drawTools();
    }
    else
    {
        glPushMatrix();
        glTranslatef(0.0, -(1-_toolbarVisiblePct) * 50, 0);
        drawTools();
        glPopMatrix();

    }
}   

}

好像您在drawTools方法的結尾禁用了紋理渲染。 OpenGL是狀態機,如果禁用狀態,它將保持禁用狀態,直到再次啟用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM