Tôi hiện đang cố gắng phát triển Voxel Engine bằng Direct3D 9 và C ++. Để giữ mức sử dụng bộ nhớ ở mức thấp, tôi chỉ chuyển vị trí, hướng và độ lệch của kết cấu voxels hiện tại trong tập bản đồ kết cấu của mỗi đỉnh tới bộ đổ bóng đỉnh.
Sau đó, shader đỉnh sẽ tính toán bình thường và chuyển nó tới pixel shader. Tôi tìm thấy bài viết này bao gồm, làm thế nào để kết cấu voxels chỉ với vị trí của họ và bình thường trong glsl.
Đây là phần tính toán tọa độ kết cấu trong trình đổ bóng pixel của tôi (SM3):
float2 tileUV = float2(dot(input.normal.zxy, input.pos3D),
dot(input.normal.yzx, input.pos3D));
float2 texcoord = input.texOffset + tileSize * frac(tileUV);
Mã này hoạt động tốt đối với các mặt có hướng z âm (bình thường [0,0, -1]), tuy nhiên, mặt sau được lật 180 ° và các cạnh và hình vuông trên / dưới được lật 90 ° / 270 ° .
Tôi không chắc chắn, nếu điều này được dịch chính xác từ glsl, bởi vì hành vi này sẽ là hành vi được mong đợi trong hlsl, nếu tôi tính toán bằng tay. Có bất cứ điều gì mà tôi đã giám sát hoặc tôi nên nhắm đến một cách tiếp cận khác?
Biên tập:
Bây giờ tôi đã quản lý để kết cấu thành công các khuôn mặt bằng cách thay thế phép tính trước đó bằng cách sau:
if(input.normal.y != 0.0f) // handle top/bottom surfaces as front/back faces
{
input.pos3D.y = input.pos3D.z;
input.normal.z = -input.normal.y;
input.normal.y = 0.0f;
}
texcoord.x = input.texOffset.x + tileSize * frac(float3(1.0f, 1.0f, 1.0f) + cross(frac(input.pos3D), input.normal)).y;
texcoord.y = input.texOffset.y + tileSize * (1.0f - frac(input.pos3D.y));
Có cách nào để tôi có thể đơn giản hóa / tối ưu hóa phương trình không? Tôi cũng có thể đề cập rằng các voxels đều được căn chỉnh theo trục và được kẹp vào tọa độ nguyên.
Chỉnh sửa2:
Đây là công thức sửa đổi của câu trả lời của zogi hoạt động như mong đợi.
float3 n = abs(normal.xyz);
float2 texcoord = float2(input.texOffset.x + tileSize * dot(n, frac(input.pos3D.zxx)),
input.texOffset.y + tileSize + tileSize * dot(-n, frac(input.pos3D.yzy)));