2013-01-07 69 views
1

在OpenGL中,有時在進行多遍渲染和後期處理時,我需要將紋理元素應用於原始的組合片段,這是全屏幕紋理合成的一部分。通常情況下,電流通過來自於該屏幕四曾有過pass.To過程中被渲染FBO紋理實現這一點,我計算對象UV屏幕空間座標。在GLSL我計算的話是這樣的:在CG/HLSL中計算屏幕紋理座標

 vec2 texelSize = 1.0/vec2(textureSize(TEXTURE, 0)); 
vec2 screenTexCoords = gl_FragCoord.xy * texelSize; 

現在我嘗試Unity3D使用CG /HLSL。這些語言的文檔很差。如何計算CG/HLSL中的屏幕uv座標?

+0

你甚至檢查過[HLSL文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/bb509561(v = vs.85).aspx)嗎?它們比GLSL更全面,包含各種非常有趣的相關文章。 – ssube

+0

我不會這麼說。 ;) –

+0

爲什麼downvoting? –

回答

3

爲了計算屏幕texcoords,通常需要傳遞的屏幕分辨率或其倒數(resrcpres)到着色器,然後使用texcoords從全屏四(假定的範圍內的[0,1])由那些修改。

編輯:請注意,在很多情況下,您希望resrcpres都可用。 res對於計算當前位置非常有用(因爲它將需要除法,所以您不希望使用rcpres),但rcpres可以在CPU上計算一次,並且對於移動單個紋素非常有用((res * uv) + rcpres)是一個來自原點的更多紋理元素)。

喜歡的東西:

float2 res; // contains the screen res, ie {640, 480} 

void postEffect(in float2 uv : TEXCOORD, ...) 
{ 
    float2 pos = uv * res; // pos now contains your current position 

邏輯在於從FS四來的COORDS是0,0在紋元0,01,1在紋理元素maxX,maxY,所以知道尺寸,你可以乘。

但是,您必須爲每個效果提供res的值,這取決於着色器系統(Unity3D可能已經完成)。

+0

是的,我看到了,但做這樣的行爲我得到圖形(後處理的東西)縮放,如果我調整窗口大小。在使用gl_FragCoord.xy OpenGL時,它不會發生。 –

+0

如果窗口大小發生變化,則需要更新傳遞給着色器的變量。 HLSL和Cg不像GLSL那樣依賴魔術變量。 – ssube

+0

我做了更新。當框架重新調整大小時,我將新的屏幕大小傳遞給着色器。 –