Tại sao có thể gặp tọa độ kết cấu lớn hơn 1 hoặc nhỏ hơn 0


11

Tôi đang nghiên cứu một văn bản về texture mappingvà trong preparing to drawphiên, tôi đọc:

Xác định các tham số gói kết cấu. Điều này sẽ kiểm soát những gì xảy ra khi gặp phải tọa độ kết cấu lớn hơn 1.0 hoặc nhỏ hơn 0,0:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap);  
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap);  

trong đó bọc là:
GL_REPEAT: chỉ định rằng mẫu này sẽ lặp lại (nghĩa là bao quanh) nếu gặp tọa độ kết cấu biến đổi nhỏ hơn 0,0 hoặc lớn hơn 1.0.

GL_CLAMP: chỉ định rằng mẫu sẽ dính dính giá trị vào 0,0 hoặc 1,0.

Nhưng không có lời giải thích lý do của việc gặp phải tọa độ kết cấu như vậy là gì?
Ví dụ, giả sử tôi vừa vẽ một hình chữ nhật và tôi muốn áp dụng một hình ảnh như một kết cấu trên nó, liệu có thể gặp các tọa độ như vậy không?

Câu trả lời:


5

Không phải tất cả các kết cấu sử dụng tọa độ kết cấu đến từ dữ liệu lưới. Ví dụ, với kết cấu phóng chiếu , bạn biến thế giới thành không gian của kết cấu. Chà, rất nhiều thế giới đó nằm ngoài phạm vi [0, 1] của kết cấu. Nếu không có một số chế độ kẹp tại chỗ, bạn sẽ gặp vấn đề.


10

Chính xác, để lặp lại một kết cấu.

Vì vậy, nếu bạn có một hình tứ giác và tọa độ kết cấu đi từ 0 đến 1, kết cấu sẽ được vẽ một lần. Nếu tọa độ đi từ 0 đến 2 và bọc được đặt thành GL_REPEAT, thì kết cấu sẽ được vẽ hai lần.

Hãy thử nó và xem nó một mình


ok @Panda Pajama vì vậy đối với một mã như thế này: float x0 = 0; // góc trên cùng bên trái của hình ảnh float y0 = 0; float x1 = x0 + ImageWidth; // góc dưới bên phải của hình ảnh float y1 = y0 + ImageHeight; glBegin (GL_TRIANGLE_STRIP); {glTexCoord2f (0, 1); glVertex2f (x0, y1); glTexCoord2f (0, 0); glVertex2f (x0, y0); glTexCoord2f (1, 1); glVertex2f (x1, y1); glTexCoord2f (1, 0); glVertex2f (x1, y0); } không có khả năng gặp tọa độ kết cấu ngoài khoảng (0,1)?
Sepideh Abadpour

1
@sepideh: Tất nhiên là không. Bạn đặc biệt giữ tọa độ kết cấu của mình trên phạm vi [0, 1]. Điều bạn không hiểu là bạn không cần phải làm vậy ; bạn có thể làm cho họ bất cứ điều gì. Ngoài ra, không đăng một loạt các mã trong ý kiến. Nếu bạn muốn làm rõ, chỉnh sửa câu hỏi của bạn.
Nicol Bolas

ok cảm ơn bạn đã hướng dẫn về việc chuyển mã cho câu hỏi của tôi. Tôi đã tìm kiếm một cách để định dạng mã trong các lệnh nhưng không thể tìm thấy !!! Vì vậy, bạn có nghĩa là gặp phải tọa độ như vậy không phải là một sự kiện có thể xảy ra trong thời gian chạy. Nó chỉ được chỉ định bởi các lập trình viên rõ ràng để lặp lại kết cấu hay không.
Sepideh Abadpour

1
@sepideh "không phải là một sự kiện có thể xảy ra" có nghĩa là gì? Chẳng hạn, việc thay đổi mã của bạn trong bình luận là điều hoàn toàn tốt glTexCoord2f(0, 2);. Điều này có một ý nghĩa rất cụ thể được xác định rõ trong cả mã và khi chương trình đang chạy. Nếu bạn thấy điều này, lập trình viên đã cố tình thực hiện nó vì nó mang lại kết quả mà họ muốn.
Joseph Mansfield

2
@sepideh Tất nhiên rồi. OpenGL sử dụng bất kỳ giá trị nào bạn cung cấp cho nó. Nếu bạn cung cấp cho nó các giá trị trong phạm vi 0 đến 1, bạn sẽ không bao giờ nhận được bất cứ điều gì khác.
Joseph Mansfield

5

Có, bạn có thể gặp tọa độ kết cấu lớn hơn 1.0 và nhỏ hơn 0.0.

Điều này phụ thuộc hoàn toàn vào mô hình, bạn đã tải. Thông thường, đối với mỗi đỉnh có vị trí, bình thường và tọa độ kết cấu được lưu trữ. Trong hầu hết các định dạng tệp lưới, tọa độ kết cấu không bị giới hạn trong bất kỳ phạm vi nào.

Điều này được sử dụng để lặp lại một kết cấu . Ví dụ, để span một thời gian kết cấu bốn giữa một quad các đỉnh, tọa độ texture sẽ là 0,0, 0,4, 4,04,4. Nếu không có kết cấu bao bì, bạn sẽ cần thêm đỉnh để chia bề mặt thành 4 lần 4 bề mặt phụ với mỗi tọa độ texture 0,0, 0,1, 1,0, 1,1. Ít đỉnh hơn dẫn đến hiệu suất kết xuất tốt hơn.

Thông thường, không mong muốn rằng người dùng nhận thấy các cạnh của một kết cấu lặp đi lặp lại. Do đó, kết cấu lặp đi lặp lại có thể điều chỉnh được trong hầu hết các trường hợp. Hơn có nghĩa là, cạnh phải mờ dần về phía bên trái và cạnh trên xuống dưới cùng. Bằng cách này, quá trình chuyển đổi diễn ra suôn sẻ và hy vọng người dùng không nhận thấy thông báo.

Một chủ đề nâng cao hơn, nhưng có liên quan là, để che giấu một cách khéo léo thực tế rằng cùng một kết cấu đã được lặp lại nhiều lần. Ví dụ, pha trộn các kết cấu lặp đi lặp lại có kích thước khác nhau, ví dụ như kết cấu tường và decal bẩn, là một kỹ thuật phổ biến.


Without texture wrapping, you would need additional vertices to split the surface into 4 times 4 sub surfaces with each the texture coordinates 0,0, 0,1, 1,0, 1,1Đó là một số lời giải thích thực tế thực tế! Cảm ơn!
Amit Tomar
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.