禎緩存保存
A. 幀緩存的詳細介紹
幀緩沖(framebuffer)是linux為顯示設備提供的一個介面,把顯存抽象後的一種設備,他允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。這種操作是抽象的,統一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節。這些都是由Framebuffer設備驅動來完成的。
幀緩沖驅動的應用廣泛,在linux的桌面系統中,Xwindow伺服器就是利用幀緩沖進行窗口的繪制。尤其是通過幀緩沖可顯示漢字點陣,成為Linux漢化的唯一可行方案。
Linux FrameBuffer 本質上只是提供了對圖形設備的硬體抽象,在開發者看來,FrameBuffer 是一塊顯示緩存,往顯示緩存中寫入特定格式的數據就意味著向屏幕輸出內容。所以說FrameBuffer就是一塊白板。例如對於初始化為16 位色的FrameBuffer 來說, FrameBuffer中的兩個位元組代表屏幕上一個點,從上到下,從左至右,屏幕位置與內存地址是順序的線性關系。
幀緩存可以在系統存儲器(內存)的任意位置,視頻控制器通過訪問幀緩存來刷新屏幕。 幀緩存也叫刷新緩存 Frame buffer 或 refresh buffer, 這里的幀(frame)是指整個屏幕范圍。
幀緩存有個地址,是在內存里。我們通過不停的向frame buffer中寫入數據, 顯示控制器就自動的從frame buffer中取數據並顯示出來。全部的圖形都共享內存中同一個幀緩存。
CPU指定顯示控制器工作,則顯示控制器根據CPU的控制到指定的地方去取數據 和 指令, 目前的數據一般是從顯存里取,如果顯存里存不下,則從內存里取, 內存也放不下,則從硬碟里取,當然也不是內存放不下,而是為了節省內存的話,可以放在硬碟里,然後通過指令控制顯示控制器去取。幀緩存 Frame Buffer,裡面存儲的東西是一幀一幀的, 顯卡會不停的刷新Frame Buffer, 這每一幀如果不捕獲的話, 則會被丟棄,也就是說是實時的。這每一幀不管是保存在內存還是顯存里,都是一個顯性的信息,這每一幀假設是800x600的解析度, 則保存的是800x600個像素點,和顏色值。
B. OpenGL ES基礎理論 (一) —— 緩存、幀緩存、上下文與坐標系等
程序會將3D場景數據保存到硬體RAM中,嵌入式系統的中央處理單元有專門為其分配的RAM,在圖形處理的過程中,GPU也有專門為其分配的RAM,使用現代硬體渲染3D圖形的速度幾乎彎完全取決於不用的內存區塊被訪問的方式。
先看一下下圖。
OpenGL ES 是 一 種 軟 件 技 術。OpenGL ES 部分運行在 CPU 上,部分運行在 GPU 上。 OpenGL ES 橫跨在兩個處理器之間,協調兩個內存區域之間的數據交換。上圖中箭頭代表了與3D渲染相關硬體組件之間的數據交換,每個箭頭也代表著一個渲染性能的瓶頸。
從一個內存區域復制數據到另一個內存區域速度是相對較慢的。更糟糕的是,除非非常小心,在內存復制發生的時候 GPU 和 CPU 都不能把內存另作它用。因此內存區域之間的數據交換需要盡量避免。
最新的 OpenGL ES 為了支持新改進的方法拋棄了對於舊式的低效的內存復制操作的支持。
OpenGL ES 為兩個內存區域間的數據交換定義了 緩存(buffers) 的概念。緩存是指圖形處理器能夠控制和管理的連續 RAM。程序從 CPU 的內存復制數據到 OpenGL ES 的緩存。在 GPU 取得一個緩存的所有權以後,運行在 CPU 中的程序理想情況下將不 再接觸這個緩存。通過控制獨占的緩存,GPU 就能夠盡可能以最有效的方式讀寫內存。 圖形處理器把它處理大量數據的能力非同步同時地應用到緩存上,這意味著在 GPU 使用 緩存中的數據工作的同時,運行在 CPU 中的程序可以繼續執行。
幾乎所有的程序提供給GPU的數據都應該放入緩存中,為緩存提供數據,需要如下7個步驟:
理想情況下,每個生成的緩存都可以使用一個相當長的時間。下面看一下上面幾個步驟的OpenGL ES的C語言函數的實現。
GPU 需要知道應該在內存中的哪個位置存儲渲染出來的 2D 圖像像素數據。就像 為 GPU 提供數據的緩存一樣,接收渲染結果的緩沖區叫做幀緩存 (frame buffer) 。程 序會像任何其他種類的緩存一樣生成、綁定、刪除幀緩存。但是幀緩存不需要初始 化,因為渲染指令會在適當的時候替換緩存的內容。幀緩存會在被綁定的時候隱式開 啟,同時 OpenGL ES 會自動地根據特定平台的硬體配置和功能來設置數據的類型和偏移。
可以同時存在很多幀緩存,並且可以通過 OpenGL ES 讓 GPU 把渲染結果存儲到 任意數量的幀緩存中。但是,屏幕顯示像素要受到保存在前幀緩存 (front frame buffer) 的特定幀緩存中的像素顏色元素的控制。程序和操作系統很少會直接渲染到前幀緩存中,因為那樣會讓用戶看到正在渲染中的還沒渲染完成的圖像。相反,程序和操作系統 會把渲染結果保存到包括後幀緩存 (back frame buffer) 在內的其他幀緩存中。當渲染後的後幀緩存包含一個完成的圖像時,前幀緩存與後幀緩存幾乎會瞬間切換。後幀緩存會變成新的前幀緩存,同時舊的前幀緩存會變成後幀緩存。
用於配置 OpenGL ES 的保存在特定平台的軟體數據結構中的信息會被封裝到一個 OpenGL ES 上下文(context)中。上下文中的 信息可能會被保存在 CPU 所控制的內存中,也可能會被保存在 GPU 所控制的內存中。 OpenGL ES 會按需在兩個內存區域之間復制信息,知道何時發生復制有助於程序的優化。
OpenGL ES 總是開始於一個矩 形的笛卡兒坐標系,如下圖所示。
OpenGL ES 坐標是以浮點數來存儲的。現代 GPU 對浮點運算做了專門的優化,即 使是使用其他數據類型的頂點也會被轉換成浮點值。
C. 3dmax vray幀緩存渲染出的圖為什麼不能保存
我知道一種方法保存很簡單別的方法就不知道了 你要在渲染設置裡面的 幀緩存中的保存路徑給兩個路徑指定文件夾 即可生成你在vray的渲染圖像 不過你如果是在Vray做了指數調整的就很難保存了
D. 3dmax 2012渲染後的幀緩存偏暗,轉成圖片格式保存後和在軟體中看到的有很大明暗差別
3dsmax2012渲染後的幀緩存偏暗,轉成圖片格式保存後和幀緩存的相差大,可以用以下兩個方法解決:
1 在首選項設置里,去掉 啟用Gamma/LUT校正 的勾,這樣渲染出來的圖和保存的圖就是一樣的對比度了。