이 기사 다음있어 메쉬 행진 좌표 : 제공계산 법선, 인덱스 및 UV는 큐브
http://paulbourke.net/geometry/polygonise/
그러나 소스 코드는 삼각형을 생성합니다.
어떻게 법선, 인덱스 및 UV 좌표를 계산할 수 있습니까?
이 기사 다음있어 메쉬 행진 좌표 : 제공계산 법선, 인덱스 및 UV는 큐브
http://paulbourke.net/geometry/polygonise/
그러나 소스 코드는 삼각형을 생성합니다.
어떻게 법선, 인덱스 및 UV 좌표를 계산할 수 있습니까?
정상적인 계산에는 두 가지 옵션이 있습니다. 삼각형의 두 모서리의 교차 곱을 취할 수 있습니다 (here). 그러면 삼각형의 각 정점이 같은 법선이되어 평면 음영을 나타냅니다. 다른 옵션은 부드러운 법선을 제공하며 12 개의 꼭지점의 이웃에있는 각 차이를 선형 적으로 보간하여 수행됩니다. GPU Gems article이이를 수행합니다.
float d = 1.0/(float)voxels_per_block;
float3 grad;
grad.x = density_vol.Sample(TrilinearClamp, uvw + float3(d, 0, 0)) -
density_vol.Sample(TrilinearClamp, uvw + float3(-d, 0, 0));
grad.y = density_vol.Sample(TrilinearClamp, uvw + float3(0, d, 0)) -
density_vol.Sample(TrilinearClamp, uvw + float3(0,-d, 0));
grad.z = density_vol.Sample(TrilinearClamp, uvw + float3(0, 0, d)) -
density_vol.Sample(TrilinearClamp, uvw + float3(0, 0,-d));
output.wsNormal = -normalize(grad);
나는 불행하게도 인덱스 버퍼를 생성하는 어떤 직접적인 경험이 없지만, UV 좌표를 들어, triplanar 텍스처 매핑을 사용하는 것이 가장 좋은 선택입니다. UV 좌표는 세계 좌표와 법선을 사용하여 픽셀 쉐이더에서 계산되며, 동일한 GPU Gems 기사는 거의 수정하지 않고도 사용할 수있는 샘플 코드를 제공합니다.
// Determine the blend weights for the 3 planar projections.
// N_orig is the vertex-interpolated normal vector.
float3 blend_weights = abs(N_orig.xyz); // Tighten up the blending zone:
blend_weights = (blend_weights - 0.2) * 7;
blend_weights = max(blend_weights, 0); // Force weights to sum to 1.0 (very important!)
blend_weights /= (blend_weights.x + blend_weights.y + blend_weights.z).xxx;
// Now determine a color value and bump vector for each of the 3
// projections, blend them, and store blended results in these two
// vectors:
float4 blended_color; // .w hold spec value
float3 blended_bump_vec;
{
// Compute the UV coords for each of the 3 planar projections.
// tex_scale (default ~ 1.0) determines how big the textures appear.
float2 coord1 = v2f.wsCoord.yz * tex_scale;
float2 coord2 = v2f.wsCoord.zx * tex_scale;
float2 coord3 = v2f.wsCoord.xy * tex_scale;
// This is where you would apply conditional displacement mapping.
//if (blend_weights.x > 0) coord1 = . . .
//if (blend_weights.y > 0) coord2 = . . .
//if (blend_weights.z > 0) coord3 = . . .
// Sample color maps for each projection, at those UV coords.
float4 col1 = colorTex1.Sample(coord1);
float4 col2 = colorTex2.Sample(coord2);
float4 col3 = colorTex3.Sample(coord3);