2012-01-31 30 views
5

Tôi là một ứng dụng Android, tôi muốn tính toán bình thường của một bề mặt đang nằm trên đỉnh khác của bề mặt này. Tôi không muốn làm điều đó trong chương trình "master" bởi vì nó mất nhiều thời gian. Trên thực tế cho mỗi đỉnh tôi vượt qua 4 mảng phao cho mỗi vextex:Làm thế nào để truy cập vào đỉnh khác trong chương trình đổ bóng đỉnh trong phiên bản 2?

attribute vec3 a_bottom; 
attribute vec3 a_left; 
attribute vec3 a_right; 
attribute vec3 a_top; 

vec3 calculNormal() { 
    return normalize(cross((a_left - a_right) , (a_bottom - a_top))); 
} 

nó rất là mã rất rất bẩn tôi biết, vì vậy thay vì đi qua 4 mảng, tôi muốn làm điều đó:

vec3 calculNormal() { 
    vec3 a_left = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - 1 ]; 
    vec3 a_bottom = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - X ]; 
    ... 
    return normalize(cross((a_left - a_right) , (a_bottom - a_top))); 
} 

Vì vậy, nó có thể trong một chương trình đổ bóng đỉnh để acess để đệm nổi hiện tại? Có một từ khóa đặc biệt như currentFloat không? Hay có khả năng nào khác mà tôi bỏ lỡ?

Trả lời

8

Điều này thực sự là không thể. Trình đổ bóng đỉnh chỉ có quyền truy cập vào đỉnh hiện đang được xử lý và các thuộc tính của nó. Và vì OpenGL ES không có phần mở rộng texture_buffer_object, bạn không thể truy cập dữ liệu của VBO bên trong trình đổ bóng. Vì vậy, cách duy nhất để truy cập vào một hàng xóm của đỉnh là bằng cách đặt chúng một cách rõ ràng như là các thuộc tính đỉnh, như trong ví dụ đầu tiên của bạn.

Nhưng vì hình dạng của bạn là hình chữ nhật, bạn cũng có thể lưu nó trong một kết cấu (hoặc sao chép nó thành một, một phần mở rộng pixel_buffer_object có thể giúp với điều đó nếu được hỗ trợ trong ES). Trong trường hợp này, bạn chỉ có thể sử dụng bộ đổ bóng phân đoạn GPGPU cổ điển, tính toán các chỉ tiêu cho mỗi "pixel" (trong trường hợp này là đỉnh) của ảnh đầu ra (trong trường hợp này là dữ liệu bình thường của hình chữ nhật) dựa trên các giá trị của hàng xóm của nó (truy cập bằng các kết cấu đơn giản). Nhưng tôi đoán cả cái đầu tiên lẫn cái thứ hai sẽ không thực sự là của bạn, xem xét các hoạt động sao chép và/hoặc bản sao bộ nhớ bổ sung, vì việc tính toán các chuẩn mực đỉnh đã khá nhanh. Các tính năng chính Bạn không phải thực hiện mọi khung hình và nếu bạn thực sự làm, thì đó là vì bạn đang cập nhật vị trí đỉnh của mình, trong trường hợp này bạn có thể sử dụng cùng một thường trình cập nhật cho dữ liệu bình thường (có thể là CPU hay GPGPU).

4

Tôi muốn tính toán mức độ bình thường của bề mặt đang nằm trên đỉnh khác của bề mặt này.

Cách tiếp cận sai. Tính toán các normals và lưu trữ chúng cùng với các đỉnh.

Tôi không muốn làm điều đó trong chương trình "chính" vì mất nhiều thời gian.

Bạn không nên tính toán lại các chỉ tiêu cho mỗi lần hiển thị. Chỉ cần tính toán chúng và lưu trữ chúng. Các tính toán trong đổ bóng đỉnh không phải là miễn phí. Và tính toán các chỉ tiêu trong VS chỉ là lãng phí năng lượng xử lý.

Tính chúng, lưu trữ chúng.

+0

Hi datenwolf. Điều gì sẽ xảy ra nếu tôi muốn lấy mẫu một bản đồ chiều cao sau khi tôi tạo một đối tượng trong thời gian chạy? Tôi có nên chạy nó thông qua một shader để lấy mẫu chiều cao, chuyển đổi các đỉnh, gửi nó trở lại, sau đó tải lên một VBO? Tôi không nghĩ rằng lấy mẫu một kết cấu trên CPU thực sự là cách, tốt cho một điều kết cấu đã được tải lên bằng cách sử dụng glTexImage và CPU không thực sự có nó. – Zebrafish

+1

@TitoneMaurice: Câu hỏi ban đầu là về mắt lưới chung. Nhưng bản đồ cao độ là một trường hợp đặc biệt, nơi bề mặt bình thường có thể được tính toán bằng cách sử dụng một convolution với hạt nhân bên phải (sự khác biệt rời rạc, còn gọi là hạt nhân gradient). Sử dụng 'textureGather' (GLSL-4 và sau đó) có thể tìm nạp một mạng lưới 2 × 2 của các ô, đó là những gì bạn cần cho điều đó.Tuy nhiên tôi vẫn khuyên bạn nên tính toán trước các tiêu chuẩn, cung cấp cho bạn những gì hiệu quả là một * bản đồ bình thường * cho kết cấu. – datenwolf

+1

@TitoneMaurice: Ý tưởng ứng dụng: Tạo chiều cao ở độ phân giải cao, tạo bản đồ bình thường từ đó, sử dụng bản đồ độ phân giải đầy đủ (trong phần đổ bóng) để tính toán chiếu sáng và bản đồ chiều cao được lấy mẫu cho chuyển vị đỉnh. Ý tưởng tiếp theo: Bạn có thể lưu trữ độ phân giải cao-normal-map và truy cập độ phân giải thấp hơn trong giai đoạn đỉnh và trong shader fragment sử dụng sự khác biệt giữa độ phân giải đầy đủ và giá trị chiều cao đỉnh như đầu vào cho một bản đồ thị sai để tăng chất lượng hình ảnh. – datenwolf

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