2012-11-23 37 views
1

在我的着色器我已經有一個具有整個內容先前渲染畫面的特殊變量。它存儲在模型到屏幕座標的混亂GLSL着色器

uniform sampler2D _GrabTexture; 

它的內容應該是: Screen content

(作爲一個方面說明,我使用的是統一的GrabPass {}讓整個屏幕也請忽略Unity的GUI)。

現在我怎樣才能渲染又一次通過,使用_GrabTexture作爲我的平面模型的紋理,所以結果與我的_GrabTexture完全一樣?

(重點是,我可以應用一些效果,如模糊,銳化等該屏幕質感之前呈現一個更合格因此飛機的質地現在程式化。)

我在最後嘗試這種通過。該變量在這兩個頂點&片段着色器聲明。

uniform sampler2D _GrabTexture; 
varying vec4 v_Position; 

頂點着色器:每個模型的頂點的

void main() 
     { 
      gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
      v_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 

     } 

商店屏幕座標作爲改變,在片段着色器中使用。

片段着色器:

void main() 
     { 
      gl_FragColor = texture2D(_GrabTexture,vec2(v_Position)); 
     } 

現在使用存儲不同位置來訪問_GrabTexture屏幕紋理。因爲它是整個屏幕我v_Position這已經是在屏幕座標應該正確地得到了正確的像素。

但結果是

enter image description here

正如你可以看到飛機的質地爲事先渲染的畫面「的種種」,但座標是不正確的。我如何解決這個問題,結果和第一張圖片一樣?

回答

4

你想得複雜。 OpenGL的告訴你,建於可變gl_FragCoord片段着色器屏幕上的片段位置。

使用GLSL-1.30或更高版本,您可以使用texelFetch,您可以直接給gl_FragCoord作爲源座標。或者您使用translate gl_FragCoord進入紋理空間座標,請參閱https://stackoverflow.com/a/5879551/524368

+0

謝謝!你的轉換可以做到這一點,因爲我不支持Unity GLSL中的texelFetch。 (我也知道'gl_FragCoord',但我想知道它是如何滑落我的頭腦的)但缺點是我無法知道着色器代碼中運行時的sampler2D的寬度和高度,所以我必須根據我的屏幕進行設置。 – 5argon

+0

@Sargon:使用均勻傳遞紋理大小作爲附加VEC2。 – datenwolf