2014-10-27 15 views
8

Tôi đang làm việc trên một dự án tải một số bản dựng cho một plugin gốc mà tôi đã viết cho Unity, để sử dụng tính năng instancing và các tính năng đồ họa tiên tiến khác. Tôi đang phát triển nó cho một bản phát hành đa nền tảng, nhưng tôi làm việc với một máy Mac để thử nghiệm được thực hiện chủ yếu với OpenGL. Tại thời điểm này, các plugin chỉ ám một quad đến trung tâm của màn hình màu với giá trị hex. Plugin này hoạt động như dự kiến ​​trong một dự án Unity trống, nhưng ngay sau khi tôi kết hợp nó vào dự án Oculus của tôi, nó bắt đầu hoạt động thất thường.Native Rendering Plugin với Oculus Rift

Trong Rift, hình dạng của plugin vẽ hai lần, một lần trải dài trên cả hai mắt và một lần vẽ khác chỉ trong giới hạn của mắt phải. Ngoài ra, bất kỳ màu nguyên thủy nào tôi áp dụng cho hình học đều bị mất và hình học xuất hiện để nhận các màu xung quanh; trên một màn hình màu đen với văn bản màu đỏ, hình học sẽ chủ yếu là màu đen với một số chảy máu đỏ vào các dòng. Ngay sau khi địa hình xanh của tôi được tải, hình được vẽ bởi plugin sẽ chuyển sang màu xanh lục.

Dưới đây là một ảnh chụp màn hình của hình học được rút ra trong một dự án Unity trống với không có gì khác:

Blank Unity project

Và đây là một ảnh chụp màn hình của hình học tương tự được vẽ trên đầu ứng dụng Oculus Rift của tôi:

Native rendering on top of Oculus Rift

đây là việc tạo ra các đỉnh mà tôi đang render (ba tọa độ và màu sắc):

Vertex verts[4] = 
{ 
    { -0.5f, 0.5f, 0, 0xFF0000ff }, 
    { 0.5f, 0.5f, 0, 0xFFff0000 }, 
    { 0.5f, -0.5f, 0, 0xFF00ff00 }, 
    { -0.5f, -0.5f, 0, 0xFFff0000 }, 
}; 

Dưới đây là các chức năng vẽ, được gọi là mỗi khung trong plugin:

// OpenGL case 
if (g_DeviceType == kGfxRendererOpenGL) 
{ 
    //initialize model view matrices 
    glMatrixMode (GL_MODELVIEW); 
    float modelMatrix[16] = 
    { 
     1,0,0,0, 
     0,1,0,0, 
     0,0,1,0, 
     0,0,0,1, 
    }; 
    glLoadMatrixf (modelMatrix); //assign our matrix to the current MatrixMode 

    //initialize projection matrix 
    glMatrixMode (GL_PROJECTION); 
    projectionMatrix[10] = 2.0f; //tweak projection matrix to match D3D 
    projectionMatrix[14] = -1.0f; 
    glLoadMatrixf (projectionMatrix); 

    // Vertex layout 
    glVertexPointer (3, GL_FLOAT, sizeof(verts[0]), &verts[0].x); 
    glEnableClientState (GL_VERTEX_ARRAY); 
    glColorPointer (4, GL_UNSIGNED_BYTE, sizeof(verts[0]), &verts[0].color); 
    glEnableClientState (GL_COLOR_ARRAY); 

    glDrawArrays(GL_LINE_LOOP, 0, 4); 

} 

Bất kỳ cái nhìn sâu sắc từ kinh nghiệm bản địa plugin/Rift lập trình đồ họa sẽ được đánh giá!

+0

Tại sao bỏ phiếu bầu? – datenwolf

+0

Lưu ý rằng bạn thường cũng phải đặt chế độ xem trước khi hiển thị. SDK OVR cung cấp một cách rõ ràng một hàm để truy vấn khung nhìn đích trong mục tiêu kết xuất. Hiện tại tôi không có máy tính có quyền truy cập vào kho lưu trữ mật khẩu của mình bằng thông tin đăng nhập dành cho nhà phát triển Oculus, vì vậy tôi không thể liên kết tại tham chiếu – datenwolf

+0

Vì tôi đang làm việc trong Unity, tôi hiện không tung SDK vào mã đã viết của mình ; chỉ cần sử dụng gói tích hợp Oculus và mã hóa trên đầu trang của nó. Trong thực tế, tôi thậm chí không chắc chắn nếu nó có thể truy cập các thuộc tính SDK OVR từ một plugin C++ bên ngoài trong thời gian chạy của Unity.Tôi muốn được mở để thêm Oculus SDK vào plugin của tôi như là một phụ thuộc, nhưng điều đó có vẻ hơi dư thừa, nếu nó sẽ làm việc ở tất cả. – Jyakku

Trả lời

0

Bạn có thể sử dụng hệ thống giao diện người dùng thống nhất để hiển thị các sprites theo nhu cầu của mình. Đây là một bài viết từ Oculus mô tả cách tinh chỉnh hệ thống giao diện người dùng Unity cho VR: https://developer.oculus.com/blog/unitys-ui-system-in-vr/

Bên ngoài Unity, bạn sẽ sử dụng các lớp quad để hiển thị trên đầu mắt FOV. Đây là lớp mô tả trong tài liệu hướng dẫn Oculus Rift: https://developer.oculus.com/documentation/pcsdk/latest/concepts/dg-render/#dg_render_layers

Quad lớp:

Một hình ảnh monoscopic sẽ được hiển thị như một hình chữ nhật ở một trao pose và kích cỡ trong thế giới ảo. Điều này rất hữu ích cho việc hiển thị trên màn hình, thông tin văn bản, nhãn đối tượng, v.v. Theo mặc định, tư thế được chỉ định tương đối so với không gian thế giới thực của người dùng và quad sẽ vẫn cố định trong không gian thay vì di chuyển với đầu hoặc chuyển động của người dùng. Đối với quads đầu bị khóa, sử dụng cờ ovrLayerFlag_HeadLocked như mô tả dưới đây.