2009-12-20 37 views
8

Tôi có một ứng dụng vẽ chế độ xem bản đồ 3 chiều đánh dấu các đường hiển thị các tính năng khác nhau. Tôi đang chuyển bản đồ sang kiến ​​trúc OpenGL-ES, nhưng có một chút rắc rối khi tìm hiểu cách hiển thị các đường đứt nét.Vẽ các đường bị cắt bằng cách sử dụng OpenGL-ES

Làm rất nhiều googling, tôi đã tìm thấy nhiều tham chiếu đến ý tưởng vẽ các đường nét đứt và đa giác được xóa khỏi OpenGL-ES vì chúng có thể dễ dàng mô phỏng bằng hình tam giác. Điều đó thật tuyệt, nhưng tôi không thể tìm thấy ai thực sự thi đua và/hoặc có mô tả các bước liên quan.

Một ví dụ, về một vấn đề mà tôi gặp phải khi cố gắng thử nghiệm khái niệm này là phối cảnh làm nghiêng dòng của tôi thành ẩn khi chúng đi về phía chân trời. Sử dụng LINE_STRIP, điều này không xảy ra và các dòng vẫn giữ nguyên chiều rộng không đổi trong bản đồ.

Bất kỳ lời khuyên nào về cách đạt được các đường chiều rộng không đổi đứt nét trong phối cảnh sẽ được đánh giá cao.

+0

Bạn đã thử một dòng bình thường - nó có làm cho chúng biến mất ở chân trời hay chỉ khi bạn sử dụng chúng được kết cấu? –

+0

Đường bình thường được vẽ chính xác, nhưng tôi không thể sử dụng chúng. Tôi đã thử áp dụng một kết cấu cho LINE_STRIP, nhưng điều này dường như không làm gì cả. Tìm kiếm mà tôi tìm thấy lời khuyên cho thấy nó sẽ không làm việc và kết cấu hình tam giác là con đường để đi. Nếu kết cấu LINE_STRIP có thể được thực hiện để hoạt động, điều đó sẽ tuyệt vời. PS - Tôi đang sử dụng egl 1.1. – Piklor

Trả lời

5

Tôi tin rằng bạn có thể áp dụng kết cấu cho một đường thẳng chứ không chỉ là hình tam giác. Bạn sẽ cần phải thiết lập tọa độ kết cấu cho mỗi đầu của dòng; kết cấu sẽ được nội suy tuyến tính dọc theo dòng.

Tính hiệu quả của giải pháp này sẽ là bất biến cho dù bạn sử dụng đường kẻ hay đường kẻ - dải đường chỉ là một cách để tạo các đường có ít đỉnh hơn.

Có một vấn đề khác: xu hướng của mẫu kết cấu trở nên nhỏ gọn như một đường thẳng ra khỏi máy ảnh. Điều này xảy ra vì nội suy tọa độ kết cấu là phối cảnh chính xác ngay cả đối với các dòng (xem phần 3.5 của thông số GL).

Có hai cách để làm được việc này:

  1. Nếu bạn có thể tính toán một "q" phối hợp cho kết cấu của bạn mà Undoes quan điểm, bạn có thể khôi phục màn hình không gian texturing. Kỹ thuật này có lẽ là quá đắt tiền.

  2. Bạn có thể chiếu kết cấu trong không gian mắt (ví dụ: glTexGen).

Texture phối hợp thế hệ tất nhiên là không có sẵn trong GLES 1.1, nhưng nếu bạn đang sử dụng đỉnh của mảng, bạn có thể giả mạo nó bằng cách:

  • Thiết texture của bạn phối hợp mảng là đỉnh của mình phối hợp mảng và
  • Sử dụng ma trận kết cấu để "chuyển đổi" các đỉnh.

Điểm bất lợi của kỹ thuật này là mẫu họa tiết sẽ ở trong không gian màn hình cố định - tức là kết cấu sẽ không chạy trên các dòng.

+0

Cảm ơn, tôi sẽ cho phép điều này. Tôi đã cố gắng texturing dòng trước đó, nhưng đã không làm cho nó hoạt động - tôi có thể đã từ bỏ sớm. Tôi muốn kết cấu lặp lại để tôi có một dấu gạch ngang phù hợp trên đường thẳng bất kể nó đã tăng bao lâu. – Piklor

+1

Nếu không có shaders tôi không nghĩ rằng bạn có thể làm điều này mà không tính toán coords ST cho mỗi khung. Với trình đổ bóng, bạn cần phải: - Mã hóa hướng của đường thẳng trong không gian mô hình trên lưới của bạn. - Trong trình đổ bóng đỉnh, chuyển đổi nó thành tọa độ không gian mắt. - Tạo bản đồ UV thực tế trong không gian màn hình (trên mỗi pixel) - Xoay mẫu lấy bản đồ UV bằng vector hướng dòng được chuyển đổi (và chuẩn hóa). Đủ để nói, điều này là khá tầm thường nếu bạn không phải là rất thoải mái với ma trận biến đổi và phối hợp không gian. :-( –

+1

Ngoài ra, bạn có thể muốn xem xét điều này: http://homepage.mac.com/arekkusu/bugs/invariance/HWAA.html Dường như rất nhiều GPU của người tiêu dùng không làm stipple Trong một số trường hợp, các vệt ngang và dọc (một trong số ít các trường hợp mà chúng nhận được đúng) chỉ đơn giản là chiếu kết cấu lặp lại của bàn cờ là đủ. –

3

Nếu tất cả những gì bạn muốn là vẽ các đường đứt nét, chỉ cần thay đổi từ GL_LINE_STRIP thành GL_LINES. Bằng cách đó, mở GL sẽ kết nối đỉnh 1 & 2, 3 & 4, 5 & 6, nhưng không phải 3 & 4 hoặc 4 & 5 để lại khoảng trống ở đó.Về bản chất nó sẽ là một đường chấm chấm nửa tỷ lệ - tương đương thô của glLineStipple (1, 0101);

IE: trong mảng đỉnh

[0,0,1,1,2,2,3,3,4,4,5,5,6,6]

OpenGL sẽ kết nối (0,0) đến (1,1), nhưng sẽ không kết nối (1,1) đến (2,2) [trong khi nó sẽ với GL_LINE_STRIP]. Sau đó nó sẽ kết nối (3,3) đến (4,4), nhưng KHÔNG (4,4) đến (5,5). Kết nối cuối cùng sẽ là (5,5) đến (6,6).

Đây là những gì nó trông giống như khi tôi đã làm điều đó:

Dotted Lines on Android

Dòng không phải là 50/50 chấm/trống rỗng bởi vì trong trường hợp của tôi, nó đại diện cho vị trí của một tổ chức trò chơi mỗi khung trò chơi - và khung trò chơi không nhất thiết phải có chiều dài bằng nhau, do đó, tỷ lệ không gian: không gian không phù hợp.

Mã này trông như thế này để vẽ nó:

public void hòa (GL10 gl) { gl.glDisable (GL10.GL_TEXTURE_2D);

gl.glColor4f(color[0], color[1], color[2], color[3]/fade); 
      //pointsBuffer holds the points on the line 
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, pointsBuffer); 

    gl.glDrawArrays(GL10.GL_LINES, 0, points.length/2); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 

}

Một ý tưởng thay thế để tạo ra một cách vẽ từng đốm cố ý nhiều hoa văn sẽ được bỏ qua đỉnh nhất định bằng cách thay vì vẽ với một mảng chỉ số (glDrawElements). Tuy nhiên, tôi không có một ví dụ về điều đó để cho bạn thấy. :/

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