如何在XNA中的3D地形上绘制圆圈?

所以我一直在网上寻找这个问题的答案,但我似乎错过了一些东西。

我有一个小项目在XNA 4.0中动态创建3D地形,但我希望能够在地形上绘制一个圆(或任何其他形状,但让我们先用圆圈)。 现在我已经阅读了一些关于“投射纹理”的内容,但我承认,当涉及着色器语言时,我完全失去了。

我的想法是,我可以(动态地)创建一个基本形状,比如一个直径为2’单位的圆,然后在地形上绘制它作为光标所在的指示器。 (我能够在3D地形上获得光标位置。)

有谁知道如何做到这一点,是否需要使用着色器? 对此事的任何帮助都是相关的!

提前致谢!

你可以使用着色器……

您将参数传递给terrain地形着色器,光标的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=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; } }