Việc thay đổi GL_TEXTURE_WRAP) _ (S / T) làm gì?


11

Tôi đang làm việc thông qua một số hướng dẫn OpenGL dành cho người mới bắt đầu và hiện tại hướng dẫn cách áp dụng một kết cấu cho một hình chữ nhật đơn giản. Các trạng thái hướng dẫn yêu cầu tôi đặt tham số kết cấu GL_TEXTURE_WRAP_S và GL_TEXTURE_WRAP_T thành GL_CLAMP_TO_EDGE, tuy nhiên tôi không chắc chắn điều này thực sự làm gì. Tôi biết rằng đó là một cái gì đó để làm với cách kết cấu lớn hơn / nhỏ hơn không gian mà chúng được ánh xạ được xử lý, nhưng tôi không chắc hành vi này thực sự gây ra. GL_CLAMP_TO_EDGE làm gì và điều này khác với GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT như thế nào? Cảm ơn rất nhiều trước và phần thưởng hữu ích nếu bạn có thể cung cấp hình ảnh cho một kẻ ngốc như tôi.

Câu trả lời:


29

Vâng S và T chỉ có nghĩa là U và V (hoặc X và Y nếu bạn thích) hoặc trong GLSL:

vec4.xyzw == vec4.rgba == vec4.strq

Chế độ GL_REPEAT có kết cấu lặp lại khi bạn đi qua phạm vi (0,0) đến (1,1)

Chế độ GL_CLAMP_TO_EDGE có kết cấu dừng ở pixel cuối cùng khi bạn rơi ra khỏi cạnh.

GL_CLAMP và GL_CLAMP_TO_BORDER không được dùng nữa vì tất cả các viền kết cấu phải là 0 pixel, vì vậy các chế độ không còn ý nghĩa nữa. (đâu đó quanh GL3 tôi tin)

Có nhiều chế độ hơn để đảm bảo đọc tài liệu. (Ví dụ: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Có một số ví dụ hay trên http://www.flipcode.com/archives/Advified_OpenGL_Texture_Mapping.shtml , đây là bản xem trước:

Bọc S: GL_CLAMP / Bọc T: GL_CLAMP

kẹp kẹp

Bọc S: GL_CLAMP / Bọc T: GL_REPEAT

kẹp lặp lại

Bọc S: GL_REPEAT / Bọc T: GL_CLAMP

lặp lại kẹp

Gói S: GL_REPEAT / Gói T: GL_REPEAT

lặp lại lặp lại


Cảm ơn. Câu trả lời chính xác. Bạn có biết nếu có bất kỳ sự khác biệt nào giữa GL_CLAMP_TO_EDGE và GL_CLAMP không, và liệu có cách nào để có được kết cấu mở rộng để lấp đầy không gian có sẵn không?
w4etwetewtwet

Xin lỗi vì đã không làm rõ, trong đó tôi nói CLAMP, ý tôi là GL_CLAMP_TO_EDGE, GL_CLAMP đã biến mất trong OpenGL hiện đại. Tôi sẽ chỉnh sửa câu trả lời để nhấn mạnh điều đó.
MickLH

Đối với "mở rộng" nếu bạn chỉ đơn giản là kéo dài kết cấu thành một phạm vi khác, thì nên xử lý trong quá trình tham số hóa lưới. (Lập bản đồ UV, công việc nghệ sĩ) .. Nếu bạn thực sự phải làm điều đó một cách thực tế thì bạn sẽ phải viết công thức của riêng bạn để sử dụng trong một shader. (Hoặc tôi đoán ma trận GL_TEXTURE nếu ứng dụng của bạn đã lỗi thời nghiêm trọng: P)
MickLH

3

Dưới đây là trích xuất của trang Tham khảo OpenGL trên glTexParameter kể từ 2014/02/07 , được định dạng một chút để dễ đọc hơn:

GL_TEXTURE_WRAP_S

Đặt tham số bao bọc cho tọa độ kết cấu s thành GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT hoặc GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE làm cho tọa độ s được kẹp vào phạm vi phạm vi, trong đó N là kích thước của kết cấu theo hướng kẹp.

  • GL_CLAMP_TO_BORDER đánh giá tọa độ của s theo cách tương tự như GL_CLAMP_TO_EDGE.
    Tuy nhiên, trong trường hợp kẹp xảy ra ở chế độ GL_CLAMP_TO_EDGE, dữ liệu texel được tìm nạp được thay thế bằng các giá trị được chỉ định bởi GL_TEXTURE_BORDER_COLOR.

  • GL_REPEAT làm cho phần nguyên của tọa độ s bị bỏ qua;
    GL chỉ sử dụng phần phân đoạn, do đó tạo ra một mẫu lặp lại.

  • GL_MIRRORED_REPEAT làm cho tọa độ s được đặt thành phần phân số của tọa độ kết cấu nếu phần nguyên của s là chẵn; nếu phần nguyên của s là số lẻ thì tọa độ kết cấu s được đặt thành 1-frac, trong đó fracbiểu thị phần phân số của s .

  • GL_MIRROR_CLAMP_TO_EDGE khiến tọa độ s được lặp lại như đối với GL_MIRRORED_REPEAT cho một lần lặp lại kết cấu, tại đó tọa độ sẽ được kẹp như trong GL_CLAMP_TO_EDGE.

Ban đầu, GL_TEXTURE_WRAP_S được đặt thành GL_REPEAT .

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.