2010-04-23 5 views
12

Vì vậy, trong cả D3D và OpenGL có khả năng vẽ từ bộ đệm chỉ mục.3 bộ đệm chỉ mục

Định dạng tệp OBJ tuy nhiên có gì lạ. Nó xác định một loạt các đỉnh như:

 
v -21.499660 6.424470 4.069845 
v -25.117170 6.418100 4.068025 
v -21.663851 8.282170 4.069585 
v -21.651890 6.420180 4.068675 
v -25.128481 8.281520 4.069585 

Sau đó, nó xác định một loạt các normals như ..

 
vn 0.196004 0.558984 0.805680 
vn -0.009523 0.210194 -0.977613 
vn -0.147787 0.380832 -0.912757 
vn 0.822108 0.567581 0.044617 
vn 0.597037 0.057507 -0.800150 
vn 0.809312 -0.045432 0.585619 

Sau đó, nó xác định một loạt các coords tex như

 
vt 0.1225 0.5636 
vt 0.6221 0.1111 
vt 0.4865 0.8888 
vt 0.2862 0.2586 
vt 0.5865 0.2568 
vt 0.1862 0.2166 

THEN nó chỉ định "khuôn mặt" trên mô hình như:

 
f 1/2/5 2/3/7 8/2/6 
f 5/9/7 6/3/8 5/2/1 

Nơi chúng tôi đang v/t/n số đầu tiên là một chỉ mục vào mảng đỉnh, thứ hai là chỉ mục vào mảng phối hợp tex, thứ ba, thành mảng chuẩn.

Vì vậy, trong cố gắng để render này với bộ đệm đỉnh,

Trong OpenGL Tôi có thể sử dụng glVertexPointer, glNormalPointerglTexCoordPointer để thiết lập con trỏ cho mỗi đỉnh, bình thường và kết cấu phối hợp các mảng tương ứng .. nhưng khi nói đến xuống để vẽ với glDrawElements, tôi chỉ có thể chỉ định ONE đặt chỉ mục, cụ thể là các chỉ mục mà nó sẽ sử dụng khi truy cập các đỉnh.

Ok, sau đó làm gì? Tôi vẫn có bộ chỉ mục để truy cập.

Trong D3D của nó cũng tương tự - Tôi có thể thiết lập 3 dòng: một cho đỉnh, một cho texcoords, và một cho normals, nhưng khi nói đến việc sử dụng IDirect3DDevice9 :: DrawIndexedPrimitive, tôi vẫn có thể chỉ định ONE bộ đệm chỉ mục, sẽ lập chỉ mục vào mảng đỉnh.

Vì vậy, nó là thể để vẽ từ bộ đệm đỉnh sử dụng mảng chỉ số khác nhau cho mỗi người trong số các đỉnh, texcoord, và bộ đệm bình thường (DÙ D3D hoặc OpenGL), hoặc tôi phải tạo một mảng xen kẽ đơn và sau đó truy cập CNTT?

+0

có thể trùng lặp của [Hiển thị lưới với nhiều chỉ mục] (http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) –

Trả lời

7

OBJ không được thiết kế để ánh xạ tới OpenGL hoặc DirectX.

Mọi thứ bạn nói đều đúng và không, không thể sử dụng chỉ mục theo thuộc tính.

Bạn phải chuyển đổi biểu diễn OBJ thành thứ gì đó chỉ sử dụng một chỉ mục duy nhất trên mỗi đỉnh (có thể nhân bản một số dữ liệu đỉnh dọc theo đường).

+0

Vì vậy, theo dõi, __can tôi giả định__ một tệp obj sẽ __never__ chuyển đổi định dạng đỉnh ở giữa? – bobobobo

+0

@bobobobo: Vâng, đã lâu rồi tôi không xử lý các tệp OBJ, nhưng tôi nghĩ có những trường hợp lạ khi một texture chỉ được áp dụng cho các phần của mô hình. Kết quả là, tôi chỉ nghĩ rằng các phần của các đỉnh có tọa độ kết cấu tương ứng. Đó là khoảng 10 năm trước, mặc dù vậy, đừng tin tôi vào nó. – Bahbar

+0

Ha ha. Bạn làm gì bây giờ? – bobobobo

2

Những gì bạn thực sự muốn làm (nói từ phía D3D của hàng rào, tôi không biết OpenGL xin lỗi) đang tải OBJ vào một mảng định dạng đỉnh tùy chỉnh - theo cách đó bạn có cấu trúc các chỉ số, đỉnh, bình thường và tex phối hợp trong nó và bạn chỉ có thể render nó bằng cách sử dụng một DrawIndexedPrimtive.

Tôi có hiểu nhầm định nghĩa sự cố của bạn ở đây không? Tôi nghĩ rằng bạn cần cung cấp thêm một chút chi tiết - bạn không cần nhiều bộ đệm chỉ mục để hiển thị một tệp OBJ duy nhất (trừ khi bạn đang cố ý tạo nhóm). Nếu đó là trường hợp, rằng bạn đang cố ý bó nó, sau đó bạn nên xem xét các đối số để DrawIndexedPrimitive cho phép bạn chỉ định một bù đắp vào VB để sử dụng.

+0

Lý do tôi cần nhiều bộ đệm chỉ mục là đỉnh, bình thường và texcoords thực sự được lập chỉ mục ở "các mức giá khác nhau" trong đặc điểm kỹ thuật khuôn mặt. Trong 'f 1/3/5 2/8/1 4/2/2', đỉnh đầu tiên sử dụng chỉ số 1 từ mảng đỉnh, chỉ số 3 từ mảng tex và chỉ số 5 từ mảng chuẩn. – bobobobo

+0

Có - bạn cần nạp dữ liệu OBJ vào các cấu trúc tùy chỉnh để hiển thị chính xác trong D3D. Một phần của quá trình này đòi hỏi phải sao chép các đỉnh để tham chiếu chính xác định dạng khuôn mặt. Có một ví dụ được bao gồm trong DirectX SDK (tùy thuộc vào phiên bản bạn đang sử dụng). Nó có thể được tìm thấy tại \ Samples \ C++ \ Direct3D10 \ MeshFromOBJ10 –

+0

@JoshuaAtkins Đó là một nơi tốt để xem việc thực hiện, tôi đã đi với một cặp vợ chồng cho vòng ra khỏi sự lười biếng. –

3

Tôi đã gặp sự cố tương tự và tìm kiếm giải pháp. Vấn đề là nhiều đỉnh có nhiều hơn 1 tọa độ kết cấu. Giải pháp của tôi là sao chép từng đỉnh trong mảng có nhiều hơn 1 tọa độ kết cấu.

Giải pháp là đây: wavefront obj file format opengl vertex mapping

Tuy nhiên tôi muốn tìm một giải pháp mà lá dữ liệu đỉnh còn nguyên vẹn để chế biến ở giữa khung với OpenCL,

Một giải pháp là để hạn chế tới 1 kết cấu phối hợp mỗi đỉnh. Tôi biết opengl có nhiều tọa độ kết cấu trên mỗi đỉnh. Làm thế nào tôi có thể sử dụng chúng với glGenBuffersARB vv Tôi không biết. Bất cứ ai có đề xuất?