2009-03-19 14 views
18

Làm cách nào tôi có thể lặp lại lựa chọn bản đồ kết cấu?Làm thế nào để sử dụng GL_REPEAT để lặp lại chỉ một lựa chọn của một bản đồ kết cấu? (OpenGL)

Ví dụ, sprite của tôi (lựa chọn) nằm trong kết cấu phối:

GLfloat textureCoords[]= 
{ 
    .1f, .1f, 
    .3f, .1f, 
    .1f, .3f, 
    .3f, .3f 
}; 

Sau đó, tôi muốn nhắc lại rằng sprite N lần để một dải tam giác (hoặc quad) được xác định bởi:

GLfloat vertices[]= 
{ 
    -100.f, -100.f, 
    100.f, -100.f, 
    -100.f, 100.f, 
    100.f, 100.f 
}; 

Tôi biết nó có liên quan gì đó với GL_REPEAT và textureCoords sẽ vượt qua phạm vi [0,1]. Đây tuy nhiên, không hoạt động: (cố gắng để lặp lại N = 10)

GLfloat textureCoords[]= 
{ 
    10.1f, 10.1f, 
    10.3f, 10.1f, 
    10.1f, 10.3f, 
    10.3f, 10.3f 
}; 

Chúng tôi đang nhìn thấy bản đồ kết cấu đầy đủ của chúng tôi lặp đi lặp lại ...

Làm thế nào tôi có thể làm điều này một cách đúng đắn?

Trả lời

18

Không thể thực hiện theo cách được mô tả trong câu hỏi. Chế độ phối cảnh kết cấu của OpenGL chỉ áp dụng cho toàn bộ kết cấu.

Thông thường, để lặp lại kết cấu, bạn sẽ vẽ một đa giác "lớn hơn" so với kết cấu của bạn. Ví dụ, nếu bạn có một kết cấu hình vuông mà bạn muốn lặp lại một số lần (nói sáu) trên một khu vực lớn hơn, bạn sẽ vẽ một hình chữ nhật rộng gấp sáu lần chiều cao của nó. Sau đó, bạn sẽ đặt tọa độ kết cấu thành (0,0) - (6,1) và chế độ kết cấu là "lặp lại".Khi nội suy qua đa giác, tọa độ kết cấu vượt quá 1 sẽ, do lặp lại được kích hoạt, "quấn quanh" trong kết cấu, khiến cho kết cấu được ánh xạ sáu lần trên hình chữ nhật.

Không có chế độ kết cấu nào hỗ trợ loại hoạt động như được mô tả trong câu hỏi, nghĩa là tất cả các bản đồ đều có phạm vi [0,1] đầy đủ, không phải một số tập con tùy ý. khi bạn đang texturing bằng cách sử dụng chỉ là một phần của kết cấu, không có cách nào để xác định rằng phối hợp kết cấu lớn hơn trong một cách mà làm cho OpenGL lặp lại nó bên trong chỉ có hình chữ nhật phụ. Bạn có hai lựa chọn: Tạo ra một texture mới chỉ có sprite bạn cần từ texture hiện có hoặc viết một chương trình đỉnh GLSL để ánh xạ tọa độ kết cấu một cách thích hợp.

+0

Nhờ "thư giãn", "Jimmy J" và "TrayMan" cho những đóng góp của bạn. Tôi đã bình chọn câu trả lời của bạn và biên soạn câu trả lời này từ câu trả lời của bạn, giờ đây mô tả rất rõ những gì đang diễn ra. – Kriem

+2

> "hoặc viết chương trình đỉnh GLSL để ánh xạ tọa độ kết cấu một cách thích hợp." Thay vào đó, phải có chương trình * đoạn *. –

+0

Điều đó phụ thuộc, Sarge. Sử dụng kỹ thuật tessellation là đỉnh hơn đoạn. Và bạn thường có thể tối ưu hóa bằng cách không thực hiện các tọa độ kết cấu tính toán trong đổ bóng kết cấu - đặc biệt với kết xuất trả lại dựa trên xếp kề. –

6

Tôi không chắc chắn bạn có thể làm điều đó. Tôi nghĩ rằng chế độ phối cảnh kết cấu của OpenGL chỉ áp dụng cho toàn bộ kết cấu. Khi sử dụng tập bản đồ, bạn đang sử dụng "các họa tiết phụ", do đó tọa độ kết cấu của bạn không bao giờ đến gần 0 và 1, các giới hạn bình thường khi gói và kẹp xảy ra.

Có thể có các tiện ích để giải quyết vấn đề này, tôi chưa chọn.

EDIT: Thông thường, để lặp lại kết cấu, bạn sẽ vẽ một đa giác "lớn hơn" so với kết cấu của bạn. Ví dụ, nếu bạn có một kết cấu hình vuông mà bạn muốn lặp lại một số lần (nói sáu) trên một khu vực lớn hơn, bạn sẽ vẽ một hình chữ nhật rộng gấp sáu lần chiều cao của nó. Sau đó, bạn sẽ đặt tọa độ kết cấu thành (0,0) - (6,1) và chế độ kết cấu là "lặp lại". Khi nội suy qua đa giác, tọa độ kết cấu vượt quá 1 sẽ, do lặp lại được kích hoạt, "quấn quanh" trong kết cấu, khiến cho kết cấu được ánh xạ sáu lần trên hình chữ nhật.

Đây là một chút thô để giải thích mà không có hình ảnh.

Dù sao, khi bạn đang tạo họa tiết chỉ bằng một phần của kết cấu, không có cách nào để xác định tọa độ kết cấu lớn hơn theo cách làm cho OpenGL lặp lại nó bên trong hình chữ nhật phụ.

+0

Hmm, GL_CLAMP ví dụ ảnh hưởng đến phụ textures bạn đang mô tả, dẫn tôi đến kết cấu ý tưởng chế độ phối hợp làm áp dụng cho các bộ phận của một kết cấu bản đồ. Hay tôi sai ở đây? (Tất nhiên, thấy rằng tôi không thể lặp lại cách tôi muốn, ngụ ý tôi thực sự đang ở trong sai :)) – Kriem

-3

Không thể được thực hiện ...

+8

Đó là đường ống nói chuyện cố định của bạn. – Kyle

5

Không ai trong số các phương thức kết cấu bọc hỗ trợ các loại hoạt động bạn đang tìm kiếm, tức là tất cả họ đều bản đồ với đầy đủ [0,1] phạm vi, không phải một số tập con tùy ý . Về cơ bản bạn có hai lựa chọn: Tạo một texture mới chỉ có sprite bạn cần từ texture hiện có hoặc viết một chương trình GLSL pixel để lập bản đồ tọa độ kết cấu một cách thích hợp.

1

Mặc dù đây có thể là chủ đề cũ; đây là cách tôi đã thực hiện nó:

Cách giải quyết là tạo nhiều mắt lưới, dán cùng nhau chứa tập con của Texture UV.

Ví dụ: Tôi có kết cấu laser chứa trong bản đồ kết cấu lớn hơn, tại U [0,05 - 0,1] & V [0,05-0,1].

Sau đó tôi sẽ xây dựng các lưới N, mỗi khung có tọa độ U [0,05-0,1] & V [0,05-0,1]. (N = chiều dài/texture.height; chiều cao là kích thước của kết cấu tôi muốn lặp lại. Hoặc dễ dàng hơn: số lần tôi muốn lặp lại kết cấu.)

Giải pháp này sẽ hiệu quả về chi phí hơn phải tải lại kết cấu sau khi kết cấu. Đặc biệt là nếu bạn thực hiện tất cả các lệnh gọi (như bạn nên).

(OpenGL ES 1.0,1.1,2.0 - Điện thoại di động Phần cứng 2011)

+0

Tuy nhiên thú vị. Cảm ơn! :) – Kriem

Các vấn đề liên quan