2012-12-17 24 views
6

Tôi chỉ mới bắt đầu tìm hiểu OpenGL là gì. Tôi đã bối rối bởi hình ảnh và kết cấu.sự khác biệt giữa hình ảnh và kết cấu trong OpenGL

  • Chỉ hình ảnh được sử dụng để tô bóng cảnh 2D. Và sử dụng các đỉnh và kết cấu để che đi cảnh trong cảnh 3D? (Ý tôi là theo thứ tự hoạt động của OpenGL Programming Guide cuốn sách. Đầu tiên chúng tôi có dữ liệu đỉnh và dữ liệu hình ảnh. Chúng tôi có thể sử dụng dữ liệu hình ảnh làm kết cấu hay không. Khi không sử dụng làm kết cấu thì chỉ có thể sử dụng nền của cảnh phải. right?)
  • Hoạt động của kết cấu có nhanh hơn thao tác hình ảnh hay không.
+2

Vui lòng thêm mô tả khác. Nói chung, một tệp hình ảnh được tải là một kết cấu. – mda

Trả lời

2

Tôi cũng mới sử dụng opengl. Và không thực sự tốt với tính toán cấp thấp/kiến ​​trúc gpu. Nhưng đây là điều tôi vừa học được và tôi đang giải thích cho bạn.

Trong OpenGL bạn không có đối tượng "hình ảnh" như trong một số khung khác (QImage trong Qt, BufferedImage trong Java Swing, Mat đối tượng trong opencv, v.v.), nhưng bạn có một số bộ đệm trong đó bạn có thể hiển thị thông qua opengl render pipeline OR lưu trữ hình ảnh.

Nếu bạn mở ngữ cảnh mờ, bạn sẽ hiển thị trong default frame buffer (trên màn hình). Nhưng bạn có thể thực hiện một số hiển thị ngoài màn hình trong một số bộ đệm khung khác, như trong render buffer. Sau đó, bạn có một số bộ đệm khác có thể lưu trữ hình ảnh trong GPU trong một số bộ đệm có thể được sử dụng như texture.

Các bộ đệm opengl (biểu tượng kết xuất hoặc kết cấu) được lưu trữ bên trong GPU (và chuyển từ GPU sang CPU hoặc ngược lại có một số chi phí). Việc chuyển từ GPU sang CPU là một hoạt động được gọi là pixel transfer.

Một số ví dụ:

  • Bạn có thể tải một hình ảnh (một bitmap từ một tập tin ví dụ) và sử dụng nó như là một kết cấu. Cậu đang làm gì ở đây? Nạp trên CPU một hình ảnh từ đĩa (một ma trận pixel), sau đó chuyển nó vào GPU và lưu trữ nó trong bộ đệm kết cấu. Sau đó, bạn có thể nói với OpenGL để render một khối lập phương với texture đó.

  • Bạn có thể hiển thị một số cảnh phức tạp cho bộ đệm hiển thị (hiển thị ngoài màn hình) trong GPU, tải nó trong CPU mặc dù thao tác chuyển điểm ảnh và lưu vào tệp.

  • Bạn có thể hiển thị cảnh thành kết cấu (hiển thị kết cấu), sau đó thay đổi thông số máy ảnh, hiển thị trên màn hình và sử dụng kết cấu được hiển thị trước đó làm kết cấu trong đối tượng gương.

Thao tác trên GPU nhanh hơn sau đó trên CPU. Tôi nghĩ (nhưng tôi không chắc chắn) rằng hoạt động trên kết cấu là một chút chậm hơn hoạt động trên bộ đệm render (vì ví dụ mipmap mở rộng quy mô mà một kết cấu có thể có và một bộ đệm render không).

Tôi nghĩ rằng đối với nền của cảnh, bạn phải sử dụng kết cấu (hoặc một số trình đổ bóng tải điểm ảnh từ bộ đệm).

Vì vậy, cuối cùng, bạn không có đối tượng hình ảnh trong opengl. Bạn có bộ đệm. Trong đó bạn có thể lưu trữ dữ liệu (chuyển từ CPU sang GPU), bạn có thể hiển thị bên trong chúng (tắt màn hình), bạn có thể đọc pixel (chuyển pixel từ GPU sang CPU). Một số người trong số họ có thể được sử dụng như một kết cấu. Điều đó có nghĩa là một số thứ khác giống như vậy chúng có thể được chia tỷ lệ với độ phân giải mipmap khác nhau và được chia tỷ lệ bằng một số phép toán gaussian, chúng có thể được khử răng cưa theo một số cách khác nhau, được kẹp, vv ..

Hy vọng điều này sẽ giúp ích một chút. Xin lỗi nếu có một số sai lầm nhưng tôi cũng đang học OpenGL.

1

Tôi cũng là người mới tham gia OpenGL. Nhưng tôi nghĩ rằng điều này artical có thể trả lời câu hỏi này rất tốt.

3

Về mặt OpenGL, hình ảnh là một mảng dữ liệu pixel trong RAM. Ví dụ, bạn có thể tải một smiley.tga trong RAM bằng các hàm C chuẩn, đó sẽ là một hình ảnh. Kết cấu là khi imagedata được tải trong bộ nhớ video của OpenGL. Điều này có thể được thực hiện như sau:

GLuint *texID; 
glGenTextures(1, (GLuint*)&texID); 
glBindTexture(GL_TEXTURE_2D, texID); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, imagedata); 

Sau khi hình ảnh được tải vào bộ nhớ video, ảnh gốc trong RAM có thể được miễn phí() ed. Kết cấu bây giờ có thể được sử dụng bởi OpenGL.

+0

@ Kevin: Tôi xin lỗi vì biểu hiện tồi tệ của tôi. Tôi đã chỉnh sửa câu hỏi của mình. thực sự tôi muốn biết hình ảnh có thể làm gì khi nó không được sử dụng làm texture – Samuel

+0

@Samuel Theo như tôi biết, OpenGL không thể làm gì với dữ liệu pixel chỉ trong RAM, bạn CÓ phải tạo texture cho nó bằng OpenGL. Tuy nhiên, bạn có thể làm bất cứ điều gì bạn muốn với các pixel đó thông qua mã của riêng bạn. Ví dụ, bạn có thể làm mờ hình ảnh, tạo ra một kết cấu ra khỏi nó để vẽ một kết cấu mờ trên màn hình. – Kevin

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