2012-02-11 17 views

Trả lời

2

tôi không thể tìm thấy ở đó là chức năng glTexImage3D trong OpenGL ES 2

Bởi vì kết cấu 3D không được hỗ trợ bởi OpenGL-ES. Hãy suy nghĩ về nó: Một kết cấu 3D đòi hỏi bộ nhớ nhiều hơn một bộ nhớ 2D. Và bộ nhớ là một nguồn tài nguyên rất khan hiếm trên các thiết bị nhúng/di động, đó là những gì ES được nhắm tới.

Tôi nghĩ có lẽ ai đó biết thuật toán sử dụng kết cấu 3D?

Đó không phải là vấn đề về thuật toán mà là một trong những tài nguyên giới hạn. Về lý thuyết, bạn có thể sử dụng nhiều đơn vị kết cấu/mẫu để tải lên các lớp ở đó và thực hiện nội suy trong trình đổ bóng. Nhưng điều này sẽ thiếu mipmaping sâu.

kết cấu 3D, ví dụ: tệp .tag?

TAG tệp? Xin lỗi, tôi không biết định dạng này. Bạn có thể cho tôi một liên kết để đọc nó? Google không tìm thấy thông tin hữu ích về nó. Bạn có thể có nghĩa là TGA?

+0

Cảm ơn bạn đã trả lời! Có, ý tôi là .tga ... – Ning

+0

Cảm ơn câu trả lời của bạn! Trong thực tế, tôi không chắc chắn những gì tôi cần là kết cấu 3d. Đó là lần đầu tiên tôi làm một số công việc với es opengl. Tôi chấp nhận một dự án và tôi cần render một ngôi nhà trên màn hình. Khi tôi mở tập tin .obj, tôi thấy mỗi vt có ba thành phần, không chỉ vt. Nếu tôi bỏ qua thành phần thứ ba của vt, kết cấu rất lạ. Có lẽ tôi sẽ không phải sử dụng 3d texture? Tôi đặt hình ảnh kết cấu theo sau. Có lẽ các chuyên gia của bạn biết những gì tôi cần. ww2.sinaimg.cn/large/991557bagw1dpytx071d5j.jpg Và hiệu ứng cuối cùng http://ww4.sinaimg.cn/large/991557bagw1dpyu275vz4j.jpg – Ning

+0

@Ning: Thành phần thứ ba 'w' hoạt động giống như tham số mở rộng. Bạn không cần nó. – datenwolf

12

OpenGL ES 1.x và 2.x không ủy quyền hỗ trợ cho họa tiết 3d - xem ví dụ: trang người dùng chuẩn cho glBindTexture, chỉ liệt kê GL_TEXTURE_2DGL_TEXTURE_CUBE_MAP làm mục tiêu - và phần cứng iOS không cung cấp bất kỳ tiện ích thích hợp nào.

Giải pháp tốt nhất mà tôi có thể đưa ra là đóng gói một texture 3D như thể nó là kết cấu 2d, vì vậy bạn đã nói kết cấu 3D 128x128x128 và bạn đặt nó thành 128 ảnh 128x128 riêng biệt một lưới 16x8 trên một kết cấu 2d duy nhất. Vì vậy, kết cấu 2d là 2048x1024 pixel, gần với giới hạn phần cứng trên thế hệ thiết bị iPhone 4 và iPad 2 và các thiết bị iOS tương thích ES 2.0 đi trước chúng.

Sau đó, bạn đưa phối cảnh kết cấu 3D vào trình đổ bóng phân đoạn chính xác như thể có cách lập chỉ mục kết cấu 3d nguyên bản, nhưng thực hiện một chút toán để thu gọn thành 2d.

Vì vậy, trong ví dụ 128x128x128, bạn muốn làm điều gì đó tương tự (mã ở đây, như tôi đã nói, chưa được kiểm tra,):

texPos.x = sourceVarying.x/16.0; // because we've packed 16 source images across, 
texPos.y = sourceVarying.y/8.0; // and 8 images down 

// we'll multiply z by 16 since then, logically, the integer part is 
// how many tiles across to index, and the decimal part is now many 
// tiles down to index 
texPos.z *= 16.0; 

// figure out how many tiles across to index, with each tile being 
// 1.0/16.0 in size 
texPos.x += floor(texPos.z)/16.0; 

// remove the integer part of z, then multiply by 8 to do much what 
// we just did to y 
texPos.z = fract(texPos.z) * 8.0; 
texPos.y += floor(texPos.z)/8.0; 

// now load the appropriate sample from texPos.xy 

Đó có thể không phải là cách hiệu quả nhất để đạt được điều đó, nó được viết cho (tương đối) rõ ràng. Bạn cũng đang xem xét bất lợi về hiệu suất đáng kể của mỗi kết cấu đọc phụ thuộc (nghĩa là GPU không thể dự đoán các truy cập bên ngoài trình đổ bóng phân đoạn, gây ra những khó khăn đáng kể về đường ống dẫn). Nhưng đó là để được cân nhắc đối với bất kỳ chi phí nào bạn sẽ phải chi tiêu để sử dụng một cái gì đó khác với bản đồ kết cấu 3d.

Cũng lưu ý rằng bạn đang thực hiện một quyền truy cập được gắn với một lát z cụ thể. Vì vậy, bạn bị giới hạn ở GL_NEAREST lấy mẫu loại trong ít nhất một thứ nguyên trừ khi bạn muốn thực hiện hai mẫu và tự kết hợp với chi phí cao hơn. Tôi cũng đã không làm gì về kẹp, mà bạn sẽ khá có thể muốn giải quyết.

Datenwolf (+1, tình cờ) cũng hoàn toàn chính xác về việc mipmapping là một vấn đề; Tôi đã kết thúc việc vô hiệu hóa nó.


cuối năm 2013 phụ lục: tại thời điểm viết bài, iOS 7, iPhone 5s, thế hệ thứ hai iPad Mini và iPad Air tất cả các hỗ trợ ES 3.0. 3.0 giới thiệu mục tiêu GL_TEXTURE_3D. Vì vậy, bạn có thể sử dụng 3d texturing trực tiếp trên các thiết bị đó và có lẽ tất cả các thiết bị iOS trong tương lai. Và, đối với hồ sơ, nó thấy sự sẵn có tương tự trên Android, đã được hỗ trợ trong tất cả các thiết bị Nexus gần đây, HTC One, một vài trong số các Samsung gần đây và những người khác.

+0

Cảm ơn câu trả lời của bạn! Trong thực tế, tôi không chắc chắn những gì tôi cần là kết cấu 3d. Đó là lần đầu tiên tôi làm một số công việc với es opengl. Tôi chấp nhận một dự án và tôi cần render một ngôi nhà trên màn hình. Khi tôi mở tập tin .obj, tôi thấy mỗi vt có ba thành phần, không chỉ vt. Nếu tôi bỏ qua thành phần thứ ba của vt, kết cấu rất lạ. Có lẽ tôi sẽ không phải sử dụng 3d texture? Tôi đặt hình ảnh kết cấu theo sau. Có lẽ các chuyên gia của bạn biết những gì tôi cần. ww2.sinaimg.cn/large/991557bagw1dpytx071d5j.jpg Và hiệu ứng cuối cùng http://ww4.sinaimg.cn/large/991557bagw1dpyu275vz4j.jpg – Ning

+1

Hình như texturing 2d bình thường; bạn có nhớ rằng OBJ lưu trữ tọa độ kết cấu y theo cách khác từ OpenGL, vì vậy bạn cần phải làm một cách nhanh chóng 1-y ở đâu đó trong đường ống của bạn? – Tommy

+0

er ... Tôi đã không làm điều đó! Cảm ơn! Tôi sẽ cố gắng làm điều đó! – Ning

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