我需要能夠創建紋理的副本並將該副本中的某些顏色更改爲java中的其他顏色。我不是很熟悉OpenGL庫,我不知道它提供什麼方法來做到這一點。我需要知道改變紋理中單個像素的顏色以及如何獲取紋理中單個像素的顏色以及如何複製紋理的好方法。如果這個問題太廣泛,我很抱歉,但我正在尋找一個廣泛的答案。使用OpenGL在Java中更改紋理中的某些顏色
0
A
回答
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()
。
相關問題
- 1. 使用着色器更改紋理某些片段的顏色
- 2. 更改紋理的顏色
- 3. 顏色在opengl中映射紋理
- 4. 使用OpenGL進行紋理顏色處理(在使用Java的LWJGL中)
- 5. OpenGL紋理顏色分離
- 6. openGL紋理和顏色
- 7. 如何將Opengl紋理中的某些顏色設置爲透明?
- 8. 某些圖形卡中的白色OpenGL紋理
- 9. 在OpenGL中使用頂點顏色和紋理?
- 10. Java - 更改JTable中某些單元格的顏色
- 11. 的Android的OpenGL ES 2.0 - 黑色紋理在某些設備上
- 12. 使用jquery更改Textarea中某些單詞的顏色?
- 13. Java OpenGL only藍色紋理
- 14. OpenGL ES 1.1顏色在字體紋理
- 15. 在OpenGL中動態更改紋理
- 16. GLSL更改紋理的像素顏色
- 17. 使用glTexImage2D在OpenGL中更新紋理
- 18. 更改某些圖表點的顏色
- 19. Fullcalendar更改某些事件的顏色
- 20. 更改某些字符的顏色
- 21. OpenGL設置紋理的透明顏色
- 22. OpenGL紋理奇怪的顏色
- 23. 在OpenGL動畫中更改顏色glutWireSphere
- 24. 用紋理圖像更改紋理顏色
- 25. 加載一些紋理與iPhone的openGL時奇怪的顏色
- 26. 在片段着色器中更改OpenGL中紋理的顏色並不起作用
- 27. 在Three.js中更改MouseOver上紋理的顏色
- 28. 用OpenGL中的顏色呈現的灰度紋理
- 29. Opengl多種紋理混合顏色
- 30. OpenGL紋理替換材質顏色
我忘了指定:我正在使用java。 – Entity1037