2010-07-27 21 views
5

Tôi có một ứng dụng opengl tải một dxf và vẽ nó trên màn hình, mỗi lần tôi cần tính toán các chuẩn. có cách nào để tính toán normals trong GPU thay vì CPU? nếu vậy thì sao?tôi có thể tính toán normals trong gpu?

Trả lời

2

Có, có thể. Bạn sẽ muốn tìm hiểu về Shaders trong Cg.

Official book.

+2

Các normals phải được tính toán trong một Shader hình học, không phân mảnh. – ext

1

Hãy xem glEnable(GL_AUTO_NORMAL).

4

Bạn có thể tính toán các tiêu chuẩn "có độ bóng mờ" (một bình thường trên mỗi mặt) từ trong trình đổ bóng hình. Một cho mỗi tam giác, "trên bay", sử dụng các sản phẩm chéo. Bạn không thể tạo ra các tiêu chuẩn "mịn" theo cách đó, bởi vì GS không có thông tin về hàng xóm.

Nếu lưới là tham số (ví dụ: metaballs), bình thường có thể được tính bằng cách lấy mẫu vài giá trị hàm lân cận. Điều này cũng có thể được thực hiện trên GPU.

Bạn cũng có thể tính toán các tiêu chuẩn trong trình đổ bóng nếu lưới dựa trên chiều cao hoặc một cái gì đó tương tự.

NẾU GPU hỗ trợ CUDA, OpenCL hoặc một cái gì đó tương tự, VÀ nếu nó có thể xử lý mảng dữ liệu tùy ý, thì bạn cũng có thể tính toán các chỉ tiêu trên GPU, sử dụng tehcniques truyền thống.

Ngoài ra, tôi nghĩ rằng 5 năm trước (hoặc lâu hơn) tôi đã thấy một bài báo có tiêu đề như "làm mịn bình thường trên GPU" hoặc "thế hệ bình thường trên GPU". Nó có một trái tim đa giác phản chiếu bóng mờ trên trang đầu tiên. Thật không may, tôi không thể xác định vị trí giấy đó, và tôi không chắc chắn chính xác nếu nó tồn tại (hoặc nơi tôi nhìn thấy nó). Bạn có thể tìm thấy nó (nếu nó tồn tại) trong các giấy tờ GDC, các giấy tờ SIGGRAPH, ATI SDK hoặc NVidia SDK.

4

Bạn sẽ phải sử dụng trình đổ bóng.

Bạn có thể sử dụng trình đổ bóng hình học GLSL. Đây là phiên bản GLSL cho các chỉ tiêu khuôn mặt. Các tiêu chuẩn đỉnh đòi hỏi nhiều công việc hơn vì chúng phải tính đến các đỉnh lân cận.

  • Đảm bảo thẻ đồ họa của bạn hỗ trợ trình tạo hình học! Sử dụng ví dụ GPU Caps Viewer.
  • Cắt và dán bất kỳ hướng dẫn nào để kết hợp trình đổ bóng hình học trong ứng dụng của bạn.
  • Các shader sẽ trông như thế này:
//glsl shader 

#version 120 
#extension GL_EXT_geometry_shader4 : enable 
void main(void) 
{ 
// Compute per-face normal 
    vec4 d1 = gl_PositionIn[1] - gl_PositionIn[0]; 
    vec4 d2 = gl_PositionIn[2] - gl_PositionIn[0]; 
    gl_Normal = cross(d1,d2); 

// Emit all input vertices 
    for(i=0; i< gl_VerticesIn; i++){ 
     gl_Position = gl_PositionIn[i]; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 
Các vấn đề liên quan