2013-04-23 25 views
5

Tôi có trình kết xuất C++ DirectX 11 mà tôi đã viết.Sử dụng nhiều bộ đệm Vertex Trong DX10/DX11

Tôi đã viết trình tải COLLADA 1.4.1 để nhập dữ liệu COLLADA để sử dụng trong hỗ trợ hoạt ảnh trên xương.

Tôi đang xác thực trình tải tại thời điểm này (và tôi đã hỗ trợ COLLADA trước trong trình kết xuất khác mà tôi đã viết trước đây bằng công nghệ khác) và tôi đang gặp sự cố khi kết hợp COLLADA với DX10/11.

Tôi có 3 bộ đệm dữ liệu đỉnh riêng biệt:

Bộ đệm đỉnh của vị trí đỉnh độc đáo. Bộ đệm đỉnh của các chỉ tiêu duy nhất. Một bộ đệm đỉnh của tọa độ kết cấu độc đáo.

Những bộ đệm đỉnh chứa chiều dài mảng khác nhau (vị trí có 2910 thành phần, normals có hơn 9000, và tọa độ texture có khoảng 3200.)

COLLADA cung cấp một danh sách tam giác đó mang lại cho tôi các chỉ số thành từng mảng đối với một hình tam giác cho trước (đầu tiên là chi tiết và được thực hiện một cách kỳ quặc, nhưng cuối cùng nó trở nên đơn giản khi bạn đã làm việc với nó.)

Biết rằng DX10/11 hỗ trợ nhiều vertex buffer Tôi đã tìm được chỉ mục DX10/11 đệm với các chỉ mục vào từng bộ đệm này * và * (đây là phần quan trọng), các chỉ số này có thể khác nhau f hoặc một điểm nhất định của tam giác.

Nói cách khác, tôi có thể thiết lập ba bộ đệm đỉnh, thiết lập bố cục nhập chính xác, và sau đó trong bộ đệm index Tôi sẽ đặt tương đương với:

l_aIndexBuffer[ NumberOfTriangles * 3 ] 

for(i = 0; i < NumberOfTriangles; i++) 
{ 
    l_aIndexBufferData.add(triangle[i].Point1.PositionIndex) 
    l_aIndexBufferData.add(triangle[i].Point1.NormalIndex) 
    l_aIndexBufferData.add(triangle[i].Point1.TextureCoordinateIndex) 
} 

Các tài liệu liên quan đến sử dụng nhiều bộ đệm đỉnh trong DirectX dường như không cung cấp bất kỳ thông tin nào về việc điều này ảnh hưởng đến bộ đệm chỉ mục như thế nào (xem thêm về điều này sau.)

Chạy mã theo cách đó. đa giác nhưng khoảng một phần ba số điểm ở đúng vị trí - gợi ý - gợi ý)

Tôi đã hình dung dữ liệu hoặc chỉ số của mình vào thời điểm này (hôm qua) vì vậy tôi đã kiểm tra cẩn thận tất cả, và vì vậy tôi đã tìm ra đầu vào hoặc thứ gì đó khác. Tôi loại bỏ điều này bằng cách sử dụng các giá trị từ bộ đệm thông thường và kết cấu để thiết lập giá trị màu được sử dụng bởi trình đổ bóng pixel, màu sắc chính xác nên tôi không gặp vấn đề về đệm.

Cuối cùng tôi đi đến kết luận rằng DX10/11 phải chờ đợi dữ liệu sắp xếp theo một cách khác nhau, vì vậy tôi cố gắng lưu trữ các chỉ số theo cách này:

indices.add(Point1Position index) 
indices.add(Point2Position index) 
indices.add(Point3Position index) 
indices.add(Point1Normal index) 
indices.add(Point2Normal index) 
indices.add(Point3Normal index) 
indices.add(Point1TexCoord index) 
indices.add(Point2TexCoord index) 
indices.add(Point3TexCoord index) 

Lạ lùng thay, điều này mang lại một lưới render mà nhìn 1/3 chính xác - gợi ý - gợi ý.

Sau đó tôi phỏng đoán rằng có lẽ DX10/DX11 muốn các chỉ mục được lưu trữ 'bởi vertex buffer' có nghĩa là tôi sẽ thêm tất cả các chỉ mục vị trí cho tất cả các tam giác trước, sau đó tất cả các chỉ số bình thường cho tất cả các hình tam giác, điều phối các chỉ mục cho tất cả các hình tam giác.

Điều này mang lại 1/3 lưới chính xác (tìm kiếm) khác.

Điều này khiến tôi nghĩ - tốt, chắc chắn DX10/11 sẽ không cung cấp cho bạn khả năng truyền từ nhiều bộ đệm đỉnh và sau đó thực sự chỉ mong đợi một chỉ mục cho mỗi điểm tam giác?

Chỉ bao gồm các chỉ mục vào bộ đệm đỉnh của vị trí tạo ra một lưới được kết xuất đúng cách mà không may sử dụng các chuẩn sai và tọa độ kết cấu.

Dường như việc đưa các chỉ số toạ độ thông thường và kết cấu vào bộ đệm chỉ mục đã gây ra lỗi vẽ trên lưới được hiển thị đúng cách.

Đây có phải là hành vi mong đợi không?

Nhiều bộ đệm Vertex - Một bộ đệm chỉ mục và bộ đệm chỉ mục chỉ có thể có một chỉ mục duy nhất cho một điểm của tam giác?

Điều đó thực sự không có ý nghĩa đối với tôi.

Trợ giúp!

+0

Ôi trời ơi, tôi không bao giờ biết bạn có thể chia dữ liệu đỉnh của bạn theo cách đó! – Lucius

+0

Tôi đã gặp vấn đề tương tự cách đây không lâu và trong khi tìm kiếm giải pháp tôi đã xem [câu trả lời này] (http://stackoverflow.com/a/2305383/1798046). Nó thực sự giúp tôi hiểu rõ hơn về vấn đề này. Tôi cũng có thể giúp bạn. – Krienie

Trả lời

2

Điều đầu tiên mà đến trong đầu tôi:

Tất cả các phần cứng có hỗ trợ tính toán shaders (tương đương với gần như tất cả DirectX 10 và cao hơn) cũng hỗ trợ ByteAddressBuffer s và hầu hết nó hỗ trợ StructuredBuffer s. Vì vậy, bạn có thể liên kết các mảng của mình dưới dạng SRV và có quyền truy cập ngẫu nhiên vào bất kỳ phần tử nào của nó trong trình đổ bóng.

Something như thế này (không được thử nghiệm, chỉ cần giả):

// Indices passed as vertex buffer to shader 
// Think of them as of "references" to real data 
struct VS_INPUT 
{ 
    uint posidx; 
    uint noridx; 
    uint texidx; 
} 

// The real vertex data 
// You pass it as structured buffers (similar to textures) 
StructuredBuffer<float3> pos : register (t0); 
StructuredBuffer<float3> nor : register (t1); 
StructuredBuffer<float2> tex : register (t2); 


VS_OUTPUT main(VS_INPUT indices) 
{ 
    // in shader you read data for current vertex 
    float3 pos = pos[indices.posidx]; 
    float3 nor = nor[indices.noridx]; 
    float2 tex = tex[indices.texidx]; 

    // here you do something 
} 

Hãy gọi đó là "cách tiếp cận shader tính toán". Bạn phải sử dụng API DirectX 11.

Ngoài ra, bạn có thể liên kết các chỉ mục của mình theo cùng một cách và thực hiện một số phép thuật trong trình đổ bóng. Trong trường hợp này, bạn cần phải tìm ra id chỉ mục hiện tại. Có lẽ bạn có thể lấy nó từ SV_VertexId.

Và có thể bạn có thể giải quyết các bộ đệm này và liên kết dữ liệu bằng cách nào đó khác (lấy mẫu kết hợp tương thích DirectX 9! O_o).

Hy vọng điều đó sẽ hữu ích!

+0

Đó là một giải pháp thú vị, tôi sẽ phải thử. Tôi sẽ được quan tâm trong việc nhìn thấy các khía cạnh hiệu suất của thiết lập này trên một cơ sở cho mỗi lưới. Cảm ơn – WTH

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