2014-09-19 202 views
0

在opengl-es 2.0中,fbo可以渲染爲紋理,使用比屏幕大的紋理目標?如果是這樣,是否有可能繪製紋理四邊形,填補fbo紋理角落?如果不可能的話,是否有可能以另一種方式在opengl-es中做到這一點?我在加載時有一些分層的程序生成的圖形,我想將它們組合成單個紋理,以便在繪製時節省性能。Opengl-es繪製紋理

回答

2

是的,絕對。只要紋理具有可呈現顏色的格式(在ES 2.0中只有RGBA4,RGB5_A1RGB565),它可以用作渲染目標。根據GPU的限制,這可能會大大超出顯示分辨率。

這意味着您主要受最大紋理大小的限制。您可以使用glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)查詢該值。

還有另外一個限制。 GL_MAX_VIEWPORT_DIMS定義您可以設置的最大視口大小。您無法渲染到大於這些值的表面。

把他們倆撮合在一起,這將給你可以渲染到紋理的最大尺寸:

GLint maxTexSize = 0; 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize); 

GLint maxViewportSize[2] = {0}; 
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, maxViewportSize); 

GLint maxRenderWidth = maxTexSize; 
if (maxRenderWidth > maxViewportSize[0]) { 
    maxRenderWidth = maxViewportSize[0]; 
} 

GLint maxRenderHeight = maxTexSize; 
if (maxRenderHeight > maxViewportSize[1]) { 
    maxRenderHeight = maxViewportSize[1]; 
} 

使用這些值,你可以創建一個大小maxRenderWidth x maxRenderHeight的紋理,並把它作爲一個FBO附件。請記得在開始渲染之前將視口設置爲相同的大小。

我檢查了來自兩個不同主要供應商的GPU的幾個平板電腦的限制。在它們兩者上,最大紋理尺寸和最大視口尺寸都相同(一個是4096,另一個是8192)。如果這很常見,我不會感到驚訝,但它絕對不能被規範保證。

ES 2.0允許最大紋理尺寸小到64.但是您會發現在最近的任何事情上,限制都會大得多。 2048處於您在任何合理的當前GPU上看到的低端,並且4096/8192很常見。最大視口尺寸保證至少與顯示屏一樣大。