2012-09-11 8 views
6

Theo định nghĩa, GL_TEXTURE_MIN_FILTER được sử dụng khi pixel đang được tạo bản đồ kết cấu đến một khu vực lớn hơn một phần tử kết cấu.Khi nào tôi nên đặt GL_TEXTURE_MIN_FILTER và GL_TEXTURE_MAG_FILTER?

Giả sử tôi có kết cấu với độ phân giải 1024 * 768 và tôi muốn ánh xạ nó thành hình chữ nhật. Các ma trận chiếu được thiết lập sử dụng:

glOrtho(0, 1024, 0, 768, 0, 1); 

và hình chữ nhật được thiết lập với:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(1024.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(1024.0f, 768.0f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 768.0f, 0.0f); 

Với cấu hình hiện tại, sự hiểu biết của tôi là mỗi pixel vào hình chữ nhật được ánh xạ tới một pixel duy nhất trong kết cấu .

Tuy nhiên, sau khi thử nghiệm, tôi phát hiện ra MIN_FILTER đang hoạt động cho cấu hình này. Ngay cả khi tôi tăng gấp đôi kích thước của hình chữ nhật, cụ thể là 2048 * 1536 và chỉ góc dưới bên trái được hiển thị trong khung nhìn, nó vẫn là MIN_FILTER đang hoạt động.

Trong tình huống như vậy, sự hiểu biết cá nhân của tôi là, mỗi pixel trong chế độ xem được ánh xạ tới chỉ một phần tư pixel trong kết cấu, tại sao vẫn còn MIN_FILTER hoạt động?

Để kiểm tra bộ lọc nào đang hoạt động, tôi chỉ cần nhận xét dòng thiết lập bộ lọc đó và xem kết quả có sai không. Nếu tôi nhận xét ra dòng thiết lập MIN_FILTER, kết quả sẽ hoàn toàn màu vàng, vì tôi không đặt mức kết cấu tối đa phù hợp với cấp độ của nó. Nhưng nếu tôi nhận xét ra dòng MAG_FILTER, kết quả vẫn chính xác.

+4

Bạn có ý nghĩa gì khi "đang hoạt động" và "không hoạt động"? –

+1

Nếu trong trường hợp của bạn, chế độ xem nhỏ hơn 1024 × 768 thì bạn sẽ thực hiện giảm hiệu quả. – datenwolf

Trả lời

11

Khi tôi hiểu điều đó, bạn nhận xét cài đặt GL_TEXTURE_MIN_FILTER và hoạ tiết không hoạt động nữa. Từ đây, bạn kết luận rằng trong quá trình xử lý, bộ lọc min được sử dụng. Và chính xác điều này là sai.

Khi không đặt bộ lọc min, nó sẽ không chỉ kỳ diệu không hoạt động. Thay vào đó, mặc định là GL_NEAREST_MIPMAP_LINEAR được sử dụng và vì bạn không chỉ định hình ảnh kết cấu cho các lớp mipmap khác, nó sẽ không hoạt động (như bạn đã đoán được chính mình, tôi nghĩ). Nhưng nó không phải là kết quả là chỉ sai nếu bộ lọc min thực sự được sử dụng cho một điểm ảnh nhất định. Kết cấu sẽ không bao giờ hoạt động bất kể bộ lọc nào được sử dụng, vì bộ lọc không hoàn chỉnh (tức là sử dụng tính năng mipmapping trong khi không có hình ảnh hợp lệ cho mỗi cấp độ mipmap). Vì vậy, nó sẽ không làm việc cho lọc mag, quá. Nó không phải là bộ lọc bị hỏng, nó là toàn bộ kết cấu.

Mặt khác, GL_TEXTURE_MAG_FILTER không có chế độ mipmapping và khi bạn không đặt chế độ, nó sử dụng giá trị mặc định là GL_LINEAR. Vì vậy, kết cấu luôn luôn hoàn chỉnh và hoạt động, không có vấn đề nếu bạn đặt bộ lọc mag hay không.

Vì vậy, phương pháp kiểm tra của bạn nếu một bộ lọc nhất định được sử dụng là rác và thực hiện của bạn có thể làm chính xác những gì bạn đã nghĩ về mặt lý thuyết.

Vì vậy, để kết luận:

  1. Bạn không cần phải thiết lập các bộ lọc min và mag cho một đối tượng kết cấu. Nếu không, họ sẽ sử dụng các giá trị mặc định. Nhưng theo mặc định, bộ lọc tối thiểu sử dụng tính năng mipmapping và yêu cầu bạn chỉ định hình ảnh cho từng cấp độ mipmap, nếu không kết cấu không đầy đủ (tức là không hoạt động), bất kể bộ lọc nào được sử dụng cho một đoạn cụ thể.

  2. Một ý tưởng hay là luôn đặt rõ ràng chế độ lọc cho từng đối tượng kết cấu không dựa vào bất kỳ giá trị mặc định nào mà bạn có thể không chắc chắn.

  3. Khi kích thước của pixel chính xác (chính xác là "chính xác" trong ngữ cảnh này?) Khớp với kích thước của một texel, rất khó để biết được chế độ lọc nào được sử dụng, nhưng không dễ dàng cách kiểm tra xem cái nào được sử dụng cho một đoạn cụ thể. Nhưng nếu bạn cần kết cấu pixel hoàn hảo (như chỉ vẽ một bitmap tới màn hình 2D), thì sử dụng GL_NEAREST cho cả bộ lọc min và mag có lẽ là ý tưởng tốt nhất và giải phóng bạn khỏi suy nghĩ về bộ lọc nào thực sự được sử dụng.