Thực hành tốt nhất với Vertices trong Open GL


8

Cách thực hành tốt nhất liên quan đến việc lưu trữ dữ liệu đỉnh trong Open GL là gì? I E:

struct VertexColored {
    public:
        GLfloat position[];
        GLfloat normal[];

        byte colours[];
}

class Terrian  {
    private:
        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;

        VertexColored vertices[];
} 

hoặc có chúng được lưu trữ riêng biệt trong lớp được yêu cầu như:

class Terrian  {
    private:
        GLfloat vertices[];
        GLfloat normals[];
        GLfloat colors[];

        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;
}

Tôi cứ nghe rằng các giá trị trên mỗi đỉnh của bạn đan xen rất quan trọng đối với hiệu suất, sẽ rất tuyệt nếu ai đó có thể giải thích chính xác lý do
dreta

1
Ví dụ thứ hai có mã sai: GLfloat [] ... -> GLfloat ... []
kravemir

Xin lỗi, tôi vừa đánh nó để đưa ra một ví dụ, tôi đến từ nền C # nơi bạn khai báo các mảng như vậy: mảng GLfloat [];
Darestium

Câu trả lời:


11

Không có thực hành tốt nhất. Tất cả mọi thứ khác nhau trên ứng dụng đang được phát triển.

Đối với trình kết xuất trò chơi , không cần lưu trữ các đỉnh trong cả RAM và VRAM , điều đó có nghĩa là bạn chỉ cần giữ lại vbo id. Ngoại lệ là địa hình nơi bạn cần có quyền truy cập vào các vị trí do vị trí / va chạm của người chơi có chiều cao.

Bạn có cần phải có tất cả dữ liệu đỉnh với nhau? Nếu bạn muốn có nhiều màu sắc cho cùng một đỉnh như các màu khác nhau cho cùng một mô hình người chơi thì việc đặt mọi thứ lại với nhau có thể gây ra trở ngại nhỏ trong quá trình phát triển.

Bạn có truy cập dữ liệu bên ngoài từ lớp học? Nếu không, bạn sẽ chỉ kết thúc với nhiều mã hơn vertices->position[i]thay vì positions[i]. Trong trình thiết kế trò chơi / mô hình, bạn cần truy cập chúng từ bên ngoài, nhưng bạn không truy cập tất cả dữ liệu cùng lúc khi bạn tạo mô hình thì bạn truy cập các vị trí và khi bạn tô màu thì bạn truy cập màu.

Điều duy nhất tôi sẽ đặt các giá trị xyz( rgb) vào một cấu trúc cho mã đẹp hơn:

Vector3 {
   GLfloat x,y,z;
};

Color3 {
   GLbyte r,g,b;
};

Chỉnh sửa: Tôi muốn thêm, rằng một số người đang sử dụng unionsđể dễ dàng hơn glVertex * 3v, glVertex * 4v, glUniform * v ... khi gọi mảng được truyền thay vì các biến tách biệt:

union Vector3f {
   GLfloat v[3];
   struct {
      GLfloat x,y,z;
   };
};

union Color3b {
   GLbyte c[3];
   struct {
      GLbyte r,g,b;
   };
};

Nếu bạn muốn các màu khác nhau cho cùng một mô hình, bạn chỉ cần thay đổi họa tiết hoặc có mọi thứ trong thang độ xám và nhân với màu (hoặc bản đồ kết cấu màu) trong pixel shader. Nhưng không giữ dữ liệu cpu nếu bạn không cần. Nhưng đôi khi bạn muốn giữ chúng, ví dụ để chiếu tia, điều đó phụ thuộc, nhưng chỉ giữ các đỉnh.
Notabene
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.