2015-04-07 73 views
0

我需要能夠創建紋理的副本並將該副本中的某些顏色更改爲java中的其他顏色。我不是很熟悉OpenGL庫,我不知道它提供什麼方法​​來做到這一點。我需要知道改變紋理中單個像素的顏色以及如何獲取紋理中單個像素的顏色以及如何複製紋理的好方法。如果這個問題太廣泛,我很抱歉,但我正在尋找一個廣泛的答案。使用OpenGL在Java中更改紋理中的某些顏色

回答

1

您可以使用glTexSubImage2D函數更改紋理中單個像素的顏色。下面是函數頭:

void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, 
GLint yoffset, GLsizei width, GLsizei height, GLenum format, 
GLenum type, const GLvoid *data); 

這裏:

  • 目標指定目標質感。
  • 級別指定詳細程度編號。級別0是基本圖像 級別。級別n是第m個縮減映像。
  • xoffset在 紋理數組中指定x方向上的紋理元素偏移量。
  • yoffset在 紋理數組中指定y方向上的紋理元素偏移量。
  • width指定紋理子圖像的寬度。

  • 高度指定紋理子圖像的高度

  • 格式指定的像素數據的格式。

  • 類型指定像素數據的數據類型。

參考:https://www.opengl.org/sdk/docs/man2/xhtml/glTexSubImage2D.xml

下面是如何使用它的代碼片斷我在底部參考的網站上找到:

void updateTexture(const chip8& c8) 
{ 
    // Update pixels 
    for(int y = 0; y < 32; ++y)  
     for(int x = 0; x < 64; ++x) 
      if(c8.gfx[(y * 64) + x] == 0) 
       screenData[y][x][0] = screenData[y][x][1] = screenData[y][x][2] = 0; // Disabled 
     else 
      screenData[y][x][0] = screenData[y][x][1] = screenData[y][x][2] = 255; // Enabled 

    // Update Texture 
    glTexSubImage2D(GL_TEXTURE_2D, 0 ,0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)screenData); 

    glBegin(GL_QUADS); 
     glTexCoord2d(0.0, 0.0);  glVertex2d(0.0,   0.0); 
     glTexCoord2d(1.0, 0.0);  glVertex2d(display_width, 0.0); 
     glTexCoord2d(1.0, 1.0);  glVertex2d(display_width, display_height); 
     glTexCoord2d(0.0, 1.0);  glVertex2d(0.0,   display_height); 
    glEnd(); 
} 

參考:http://www.multigesture.net/articles/how-to-draw-pixels-to-a-texture-opengl/

希望有幫助!

1

複製紋理的最簡單方法是使用glCopyTexImage2D()。這使您可以將當前幀緩衝區的內容複製到紋理。如果您想使用其他紋理作爲源,則可以將該紋理設置爲幀緩衝區對象(FBO)的內容。

比方說,您已經有一個名稱爲srcTexId的紋理,您想將其用作複製操作的源。現在,你需要首先創建爲您的目的地的新的紋理,我們將其稱爲dstTexId

GLuint dstTexId = 0; 
glGenTextures(1, &dstTexId); 
glBindTexture(GL_TEXTURE_2D, dstTexId); 
glTexParameteri(...); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, 
      GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

注意的最後一個參數使用NULL。這意味着紋理內容是以給定的格式/大小分配的,但是紋理沒有填充數據。

現在我們需要一個FBO,並與源紋理作爲內容設置它:

GLuint fbo = 0; 
glGenFramebuffers(1, &fbo); 
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); 
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
         GL_TEXTURE_2D srcTexId, 0); 

一切準備就緒執行現在的副本:

glBindTexture(GL_TEXTURE_2D, dstTexId); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, width, height, 0); 

然後你就可以清理你的綁定,如果你想保持國家不受干擾:

glBindTexture(GL_TEXTURE_2D, 0); 
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); 

複製紋理的另一種選擇是glBlitFramebuffer()。要使用它,你會創建兩個FBO,一個用於閱讀,一個用於寫作。所以它需要更多的設置,但它也更加靈活。例如,它允許您將內容的大小(比例)作爲副本的一部分進行調整(glCopyTexImage2D()不支持)。

要在創建副本後修改紋理的某些部分,請使用glTexSubImage2D()

+0

我忘了指定:我正在使用java。 – Entity1037