Mô hình Moires mặc dù sử dụng mipmap


7

Tôi đang làm việc trên ứng dụng Silverlight. Tôi đang cố gắng để làm cho sàn được phủ bằng gạch. Mặc dù tôi đang sử dụng bản đồ mip nhưng tôi vẫn nhận được các mẫu Moire khủng khiếp, khi cố gắng hiển thị diện tích lớn.

Những gì tôi đang làm là tạo ra hình khối và sau đó che nó bằng một ô duy nhất:

nhập mô tả hình ảnh ở đây

Trong pixel shader của tôi, tôi nhân các tọa độ kết cấu để tạo sàn lát gạch (nếu không tôi sẽ có một ô được kéo dài trên hình khối của mình). Mã pixel shader:

float Width                 : register(c3);                  //Width of cuboid
float Height                : register(c4);                  //Height of cuboid

texture texTexture;
sampler textureSampler  : register(s0) = sampler_state {
    Texture = (texTexture);
};

struct VsOutput
{
    float4 position : POSITION;
    float3 dirLightPosition : COLOR;
    float2 texCoord : TEXCOORD0;
    float3 normal   : TEXCOORD1;
    float3 view : TEXCOORD2;
};

float4 main(VsOutput IN) : COLOR
{
    float2 texCoord = float2(IN.texCoord.x * Width / 4.0f, 
                             IN.texCoord.y * Height / 4.0f); //multiplying texture coordinates


    float4 texColor = tex2D(textureSampler, texCoord);

    return float4(color.r, color.g, color.b, 1.0f);
}

Đầu ra của tôi là:

nhập mô tả hình ảnh ở đây

Tôi có thể làm gì khác để ngăn chặn việc tạo các mẫu Moires trên kết cấu?


Bạn đã xác minh rằng mipmap thực sự được sử dụng? Ảnh chụp màn hình trông giống như bộ lọc song tuyến, thay vì bộ ba,
Julien Guertault

@JulienGuertault Có thể đó là thị lực kém của tôi nhưng tôi không thể thấy bất kỳ sự gián đoạn khác biệt nào có thể chỉ ra là song tuyến + bản đồ MIP gần nhất.
Simon F

Trên thực tế trạng thái lấy mẫu của tôi được đặt thành AnisotropicWrap, mà theo tôi, là tốt nhất. Ngoài ra tôi chắc chắn 100% rằng tôi sử dụng mipmap.
bartosz.baczek

@SimonF: xin lỗi vì sự nhầm lẫn, ý tôi là tuyến tính. Nhưng dù sao, rõ ràng vấn đề sẽ ở nơi khác.
Julien Guertault 7/10/2015

1
@Nero Tôi đã làm như vậy :)
bartosz.baczek

Câu trả lời:


5

Hai điều tôi suy nghĩ:

  1. Khi tạo các mức bản đồ mip nhỏ hơn của bạn, hãy cố gắng tránh sử dụng bộ lọc hộp 2x2 đơn giản bởi vì, mặc dù rẻ và vui vẻ, nhưng chúng thực sự rất kém trong việc xóa thông tin tần số cao (vượt quá giới hạn Nyquist) cũng như lọc một số mức thấp hơn thông tin tần số bạn cần giữ. (Ngoài ra, bên cạnh đó, bạn cần thực hiện việc tạo bản đồ MIP trong không gian tuyến tính. Nếu dữ liệu nguồn của bạn là sRGB, do đó bạn cần ánh xạ đến và từ tuyến tính). FWIW, Trong bài báo gốc của Williams về lập bản đồ MIP, ông nói rằng ông đã sử dụng "cửa sổ (Fourier)" để tạo các mức được lọc trước, đây sẽ là một chức năng chân thành trong không gian hình ảnh.

  2. Lọc Trilinear tiêu chuẩn cũng sẽ vượt qua và dưới các phần của kết cấu. Nếu bạn không thích răng cưa, bạn có thể phải điều chỉnh độ lệch để tăng độ lọc (sẽ làm tăng độ mờ) và / hoặc b) thử sử dụng lọc bất đẳng hướng.


Xin lỗi vì câu hỏi có thể ngu ngốc, nhưng 'bộ lọc hộp 2x2' là gì? Nó có tên nào khác không?
bartosz.baczek 7/10/2015

Tôi chỉ có nghĩa là phương pháp ngây thơ của việc tạo mức bản đồ X * Y MIP thấp hơn tiếp theo từ mức 2X * 2Y phía trên nó. Tức là trung bình 2x2 texels ở cấp trên để tạo ra texel tương ứng ở cấp dưới. Nó rẻ, nhưng nó không tuyệt vời. Ngay cả một bộ lọc lều 4 x 4 đơn giản cũng sẽ tạo ra kết quả tốt hơn nhiều.
Simon F

Chỉ để đảm bảo rằng tôi hoàn toàn hiểu bạn - bây giờ tôi đang tạo bản đồ mip của mình như thế này: pastebin.com/nX1MVvEp . Thay vào đó tôi nên tạo mipmap từ kết cấu ban đầu của tôi với kích thước ban đầu có?
bartosz.baczek 7/10/2015

Chà, tôi không biết những gì bên trong chức năng "thay đổi kích thước" nên hơi khó trả lời. Các chuỗi, tức là. 1024 tạo 512, 512 tạo 256, v.v. sẽ không phải là một vấn đề lớn, miễn là những gì đang diễn ra bên trong "thay đổi kích thước" là ổn. Là một thử nghiệm, bạn có thể tạo một kết cấu 1024 ^ 2 đó là tất cả 0xFFFFFF ngoại trừ pixel trên cùng bên trái mà bạn đặt thành màu đỏ thuần, (0x0000FF). Bạn nhận được gì trong kết quả 512 ^ 2?
Simon F


2

GIẢI PHÁP

Tôi đã quản lý để giải quyết vấn đề của mình bằng cách tăng kích thước của kết cấu 2048x2048px để có thể tạo ra nhiều mipmap hơn. Ngoài ra, có vẻ như việc thay đổi SamplerState của tôi thành dạng bất đẳng hướng thành thứ gì đó tương tự đã giúp:

SamplerState MirrorTexCoord = new SamplerState()
        {
            AddressU = TextureAddressMode.Mirror,
            AddressV = TextureAddressMode.Mirror,
            .
            .
            .
        };

Trên thực tế tôi không biết TextureAdressMode.Mirror là gì, nhưng nó đã giúp rất nhiều, bây giờ nó trông như thế này:

nhập mô tả hình ảnh ở đây


1
Gương có khả năng xác định những gì xảy ra khi kết cấu của bạn lặp lại. Ở chế độ bình thường (chỉ xem xét theo chiều ngang) nếu bạn có kết cấu trông giống như "<" bạn sẽ nhận được "<<<<<". Với phản chiếu, bạn nhận được "<> <> <> <> <". Rõ ràng cũng có thể áp dụng cho hướng dọc là tốt.
Simon F

Có vẻ như tăng độ phân giải là người trợ giúp chính. Các mẫu Moires chỉ vừa mới bắt đầu hình thành ở góc sau của hình chữ nhật.
RichieSams

Trên thực tế không, phản chiếu thực hiện hầu hết công việc :) Tôi đã thử nghiệm nó chỉ với phản chiếu và chỉ với kết cấu lớn hơn, và hóa ra gương đó mang lại hiệu quả tuyệt vời. Kết cấu gạch Fortunatelly là mô phỏng nên nó không phải là vấn đề lớn.
bartosz.baczek

Thật khó để đánh giá mức độ cải thiện này đã được thực hiện do máy bay không kéo dài đến khoảng cách như trong ví dụ trong câu hỏi.
trichoplax
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.