HLSL - Kết cấu Voxel


7

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)));

Câu trả lời:


2

Công thức đầu tiên bạn đề cập không phù hợp với kết quả mà bạn muốn đạt được. Tôi đề nghị công thức sau thay thế:

float3 n = abs(input.normal.xyz);
float2 tileUV = float2(dot(n,  input.pos3D.zxx),
                       dot(-n, input.pos3D.yzy));

Các nvector cơ bản lựa chọn bên cạnh khối lập phương, như chính xác một phối hợp là 1, còn lại là 0. Bởi vì nguồn gốc trong kết cấu phối hợp không gian là ở góc trên cùng bên trái của kết cấu trong DirectX, trong khi nó đang ở dưới cùng còn lại trong OpenGL , tọa độ kết cấu thứ hai phải được phủ định.


Cảm ơn, với những sửa đổi nhỏ, điều này hoạt động như mong đợi. Xem chỉnh sửa của tôi cho công thức cuối cùng.
user000user
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.