2011-11-03 123 views
1

所以我一直在尋找跨網絡找到這個問題的答案,但我似乎失去了一些東西。如何在XNA的3D地形上繪製圓形?

我有一個小項目要動態地在XNA 4.0創建的3D地形,但我希望能畫一個圓(或任何其他形狀對於這個問題,但讓我們先用一個圓圈走)對地形。 現在我已閱讀了一些關於「投影紋理」的內容,但我承認在着色器語言方面我完全喪失了功能。

的想法是,我可以(動態地)創建一個基本的形狀,說用2「單元」直徑的圓,然後繪製該地形上以用作指示器光標所在。 (我能得到的3D地形光標位置。)

會有人知道如何做到這一點,是使用着色器這個需要它?任何關於此事的幫助都是有好處的!

在此先感謝!

回答

4

可以使用着色器...

你傳遞作爲參數傳遞給地形渲染,你的光標的3D世界中的地位,以及半徑...來定義一個球體,

的伎倆將頂點着色器的頂點世界位置傳遞給像素着色器,而像素着色器中的頂點世界位置僅在像素被繪製時着色輸出顏色,則位於球體內。

編輯:我發現我自己做了一箇舊的着色器......有兩種選擇圓形和框,在這裏你是:

uniform float4x4 xWorldViewProjection; 
uniform float3 xCursorPos; 
uniform float xCursorRadio; 
uniform float4 xLightColor = float4(0.8, 0.8, 0.8,1); 
uniform float4 xAmbientFactor = 0.4f; 
uniform float3 xCamPos; 

uniform int xCursorType=0; // 0: Circle 1: Box 

void VS_Basico(
    in float4 inPos : POSITION, 
    in float3 inNormal : NORMAL0, 
    in float4 inColor : COLOR0, 
    out float4 outPos: POSITION, 
    out float3 outNormal:TEXCOORD1, 
    out float3 outPos2 : TEXCOORD0, 
    out float4 outColor: COLOR0 
    ) 
{ 
    outPos = mul (inPos, xWorldViewProjection); 
    outNormal = inNormal; 
    outPos2 = inPos.xyz; 
    outColor = inColor; 
} 

float4 PS_CursorPerPixelCircular (in float4 inColor : COLOR, in float3 inPos:TEXCOORD0) : COLOR 
{ 
    float f = distance(inPos, xCursorPos); 
    float4 outColor = inColor; 
    if (f<xCursorRadio) { 
     outColor=lerp(float4(0,1,1,1), inColor, 0.4) ; 
    } 
    return outColor; 
} 

float4 PS_CursorPerPixelCuadrado (in float4 inColor : COLOR, in float3 inPos:TEXCOORD0) : COLOR 
{ 
    float3 size = float3(xCursorRadio,xCursorRadio,xCursorRadio); 

    float3 minSize = xCursorPos - size; 
    float3 maxSize = xCursorPos + size; 
    float4 outColor = inColor; 

    if (inPos.x>=minSize.x && inPos.x<=maxSize.x && inPos.y>=minSize.y && inPos.y<=maxSize.y && inPos.z>=minSize.z && inPos.z<=maxSize.z) 
    { 
      outColor=lerp(float4(0,1,1,1), inColor, 0.4) ; 
    } 
    return outColor; 
} 

void PS_Basico( 
    in float4 inColor : COLOR0, 
    in float3 inPos:TEXCOORD0, 
    in float3 inNormal:TEXCOORD1, 
    out float4 outColor: COLOR0 
    ) 
{ 

    float3 xLightPos = float3(40, 40, 0); 

    float3 LightDir = normalize(inPos - xLightPos); 

    float3 reflectionVector = reflect(LightDir, inNormal); 

    float3 eyeVector = inPos - xCamPos; 

    float specular = dot(normalize(reflectionVector), normalize(eyeVector)); 

    specular = pow(specular, 256); 

    float difusse_factor = -dot(normalize(inNormal), LightDir); 

    if (difusse_factor<0) difusse_factor = 0; 

    float4 col = inColor * xAmbientFactor + inColor * difusse_factor * xLightColor; 

    if (xCursorType ==0) 
    { 
     col = PS_CursorPerPixelCircular(col, inPos); 
    } else { 

     col = PS_CursorPerPixelCuadrado(col, inPos); 
    } 

    col.a = 1; 
    col.rgb += specular; 

/* col.xyz = col.xyz * (inPos.y+1)/2; 
    col.y = 2*col.x; 
    col.z = 2*col.x; 
    */ 
    outColor = col; 
    //outColor = float4(inNormal, 1); 
} 

//------------------------------------------------------------------------------------------------------------- 
//------------------------------------------------------------------------------------------------------------- 
//--- TECNIQUES ----------------------------------------------------------------------------------------------- 
//------------------------------------------------------------------------------------------------------------- 
//------------------------------------------------------------------------------------------------------------- 


technique ColoredWired 
{ 
    pass Pass0 
    { 
     VertexShader = compile vs_2_0 VS_Basico(); 
     PixelShader = compile ps_2_0 PS_Basico(); 
     FILLMODE = WIREFRAME;  
    } 
} 

technique ColoredSolid 
{ 
    pass Pass0 
    { 
     VertexShader = compile vs_2_0 VS_Basico(); 
     PixelShader = compile ps_2_0 PS_Basico(); 
     FILLMODE = SOLID;  
    } 
} 
+0

所以我會需要在着色器的設置參數光標的vector3?還是有其他方式將其傳遞給着色器? – Strike

+0

你可以將它作爲頂點的一部分傳遞,但沒有意義,因爲你只有一個遊標,這將是一種浪費。 – Blau

+0

我添加了一個我以前製作的着色器。 – Blau