2013-11-25 83 views
4

我正在使用程序紋理,除非很遠,否則看起來很好,小紋理像素會分解成噪點和波紋圖案。高級莫爾在HLSL/GLSL程序紋理着色器中減少圖案着色器 - 抗混淆

我已經開始尋找一種解決方案來平均和量化模式的規模很遠,並關閉,以便它靠近是完全詳細的,遠在四捨五入,使一個像素的一個遙遠的山只代表了那裏找到的一種顏色,在那一點上不是10種或20種顏色。

這是很容易通過四捨五入World_Position的體紋理是基於這樣做使用if語句,即:

if(camera-pixel_distance > 1200 meters) {wpos = round(wpos/3)*3;}//---round far away pixels 
    return texturefucntion(wpos); 

舍遠紋理的結果是,他們看起來是這樣,但很遠很遠:http://i44.tinypic.com/2r4ph1d.jpg 與此有關的麻煩是我必須作出約5如果條件的各種距離,我必須估計一個隨機良好的舍入值

我試圖做一個功能,減少的距離像素轉換爲距離步驟,並將LOD分解器應用於pixel_worldp命題值使它在距離上逐漸變圓,但我得到的是無意義的結果,實際上HLSL完全被拋棄了。這是企圖:

float cmra= floor(_WorldSpaceCameraPos/500)*500; //round camera distance by steps of 500m 
float dst= (1-distance(cmra,pos)/4500)*1000 ; //maximum faraway view is 4500 meters 
pos= floor(pos/dst)*dst;//close pixels are rounded by 1000, far ones rounded by 20,30 etc 

它返回了無法理解的模式,我無法理解。

是否有良好的記錄算法用於平滑和舍入距離紋理僞影?我可以使用scren像素分辨率,結合像素距離,將每個像素四捨五入爲一種顏色,保持穩定的顏色?

回答

3

您是否熟悉GLSL(我將假設HLSL)功能dFdx()dFdy()fwidth()?他們是專門解決這個問題。從GLSL Spec

genType dFdy(genType P) 返回使用本地差分對輸入參數p y中的導數。 這兩個函數通常用於估計用於消除鋸齒過程紋理的濾鏡寬度。

genType fwidth(genType P) 使用本地差分對輸入參數p返回x和y的絕對衍生物的總和,即:ABS(dFdx(P))+ abs(dFdy(p));

+0

在HLSL聽起來不錯,DDX DDY,它是那種我要尋找的東西,所有的話題與抗鋸齒。謝謝!!! –

2

好的,我找到了一些很棒的代碼和解決方案的教程,它是一個簡單的代碼,可以通過距離和許多參數進行調整。

從本教程: http://www.yaldex.com/open-gl/ch17lev1sec4.html#ch17fig04

half4 frag (v2f i) : COLOR 
{ 
float Frequency = 0.020; 
     float3 pos = mul (_Object2World, i.uv).xyz; 
     float V = pos.z; 
     float sawtooth = frac(V * Frequency); 

     float triangle = (abs(2.0 * sawtooth - 1.0)); 
     //return triangle; 
     float dp = length(float2(ddx(V), ddy(V))); 
     float edge = dp * Frequency * 8.0; 
     float square = smoothstep(0.5 - edge, 0.5 + edge, triangle); 
     // gl_FragColor = vec4(vec3(square), 1.0); 
     if (pos.x>0.){return float4(float3(square), 1.0);} 
     if (pos.x<0.){return float4(float3(triangle), 1.0);} 
}