2013-07-16 72 views
4

我想創建一個空白(沒有alpha的白色)紋理,我可以加載其他紋理並寫入其中的一部分。我試着只需要獲得紋理的一部分,並使用glTexSubImage2D來放置它,但它似乎並不正確。任何人有任何想法如何做到這一點?我究竟做錯了什麼?在openGL中。你如何複製紋理的一部分到另一個紋理

int sourceTextWidth; 
int sourceTextHeight; 
int sourceFormat; 
int formatOffset = 0; 

//bind the texture 
glBindTexture(GL_TEXTURE_2D, textureID); 

//get its params 
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &sourceFormat); 
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &sourceTextWidth); 
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &sourceTextHeight); 
switch (sourceFormat) 
{ 
    case GL_RGB: 
    { 
     formatOffset = 3; 
    } 
    break; 
    case GL_RGBA: 
    { 
     formatOffset = 4; 
    } 
    break; 
} 
if (formatOffset == 0) 
{ 
    return false; 
} 


unsigned char * sourceData = (unsigned char *)malloc(sourceTextWidth * sourceTextHeight * formatOffset); 

glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, sourceData); 

glBindTexture(GL_TEXTURE_2D, m_currentTextureId); 

unsigned char * destData = (unsigned char *)malloc(width * height * 3); 



glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, sourceData); 

for (int i = 0; i < height; ++i) 
{  
memcpy(&destData[(i * width * 3) ], &sourceData[((i + y) * sourceTextWidth * 3) + (x * 3)], width * 3); 
} 
//glDeleteTextures (1, m_currentTextureId); 
glBindTexture(GL_TEXTURE_2D, m_currentTextureId); 

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGB,GL_UNSIGNED_BYTE, destData); 
free(destData); 
free(sourceData); 
+0

嘗試使用glCopyTexSubImage2D:http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexSubImage2D.xml –

+0

但是,使用glCopyTexSubImage2D,您需要確保您正在讀取紋理,而不是backbuffer,我相信使用glFramebufferTexture2D。 –

+0

我回答了OpenGL的GPU內部拷貝的這個問題,但是StackOverflow變得很愚蠢,因爲我的非常精確的問題被標記爲一個糟糕的非法的副本,而另一個高級用戶甚至改變了我的問題,使其不再有任何意義。現在,我希望每個人都可以自己找到解決問題的方法。 – thewhiteambit

回答

6

如果您有機會獲得OpenGL 4.3 or the ARB_copy_image extension(或者它的老前輩,NV_copy_image),那麼你可以use glCopyImageSubData

否則,你可以使用FBO blitting。您將源紋理附加到an FBO,將目標紋理附加到FBO(可能是同一個,但如果是這樣,那麼顯然不是相同的連接點),請設置read buffersdraw buffers以使FBO從源附件讀取並畫到目標附件,然後blit from one framebuffer to the other

你試圖做的伎倆不行,順便說一句,因爲你從來沒有分配存儲爲你的新紋理。 glTexSubImage不能被稱爲紋理圖像,除非storage for that image已被分配。這可以通過call to glTexImage or one of a number of other functions.「SubImage」函數全部用於上傳到現有存儲,而不用於創建新存儲。

+0

謝謝!我遇到了一些問題,但工作效率很高。 – Django

相關問題