2011-04-18 50 views
16

Tôi đang cố gắng quấn đầu quanh các kết cấu dấu chấm động, nhưng tôi thấy khó tìm ra bất kỳ tài nguyên nào giải thích chúng cho tôi .. Tôi đã thử đọc thông số kỹ thuật OpenGL ARB_texture_float, nhưng tôi vẫn không thể lấy nó trong đầu.Kết cấu điểm nổi chính xác là gì?

Và dữ liệu dấu chấm động liên quan đến dữ liệu RGB 8 hoặc bit 8 bit mỗi kênh thông thường từ một hình ảnh mà tôi tải vào kết cấu như thế nào?

Cảm ơn sự giúp đỡ và mọi thông tin liên quan đến câu hỏi của tôi !!

Trả lời

3

Kết cấu FP có phạm vi định dạng nội bộ được chỉ định đặc biệt (RGBA_16F, RGBA_32F, v.v ...). Kết cấu thông thường lưu trữ dữ liệu điểm cố định, vì vậy việc đọc từ chúng cung cấp cho bạn [0,1] giá trị dải ô. Ngược lại, kết cấu FP cho bạn [-inf, + inf] là kết quả (không nhất thiết phải có độ chính xác cao hơn).

Trong nhiều trường hợp (như kết xuất HDR), bạn có thể dễ dàng tiến hành mà không cần kết cấu FP, chỉ bằng cách chuyển đổi các giá trị để vừa với phạm vi [0,1]. Nhưng có những trường hợp như hiển thị bị trì hoãn khi bạn có thể muốn lưu trữ, ví dụ như phối hợp không gian thế giới mà không quan tâm đến phạm vi của chúng.

+0

Chúng cũng hữu ích khi nhận dữ liệu cho trình đổ bóng (ví dụ: isovalues). – pmr

+0

Vậy làm thế nào bạn sẽ đọc về một hình ảnh 8-bit RGB hoặc RGBA bình thường trên mỗi kênh và các giá trị được diễn giải như thế nào? ví dụ. giá trị khác nhau, từ 0-255 hoặc 0-1 có được chia tỷ lệ cho một số phạm vi khác trong nội bộ không? – lokstok

+0

@lokstok. Có một tham số để glTexImage gọi là 'chuẩn hóa'. Nếu được đặt thành "true", byte đầu vào của bạn sẽ được chuyển đổi trong phạm vi [0,1]. Nếu không, tôi cho rằng bạn sẽ nhận được [0-255] (Tôi đã không thử điều đó). – kvark

15

Đây là một chút đọc here về điều đó.

Kết cấu điểm nổi cơ bản là kết cấu trong đó dữ liệu là loại dấu phẩy động :) Đó không phải là kẹp. Vì vậy, nếu bạn có 3.14f trong kết cấu của bạn, bạn sẽ đọc cùng một giá trị trong bóng đổ.

Bạn có thể tạo chúng với số kênh khác nhau. Ngoài ra bạn có thể crate 16 hoặc 32 bit kết cấu tùy thuộc vào định dạng. ví dụ.

// create 32bit 4 component texture, each component has type float  
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, data); 

nơi dữ liệu có thể là như thế này:

float data[16][16]; 
for(int i=0;i<16*16;++i) data[i] = sin(i*M_PI/180.0f); // whatever 

sau đó trong shader bạn có thể nhận được chính xác cùng (nếu bạn sử dụng float32 texture) giá trị.

ví dụ:

uniform sampler2D myFloatTex; 
float value = texture2D(myFloatTex, texcoord.xy); 

Nếu bạn đang sử dụng định dạng 16bit, hãy nói GL_RGBA16F, sau đó bất cứ khi nào bạn đọc trong bóng đổ, bạn sẽ có một hội tụ. Vì vậy, để tránh điều này bạn có thể sử dụng loại half4: giá trị half4 = texture2D (my16BitTex, texcoord.xy); Vì vậy, về cơ bản, sự khác biệt giữa 8bit chuẩn và kết cấu dấu chấm động là trong trường hợp đầu tiên giá trị của bạn sẽ được đưa vào phạm vi [0..1] và được kẹp, trong khi sau đó bạn sẽ nhận được các giá trị của bạn như là (ngoại trừ 16 < -> 32 chuyển đổi, xem ví dụ của tôi ở trên).

Không phải là bạn có thể muốn sử dụng chúng với FBO làm mục tiêu kết xuất, trong trường hợp này bạn cần biết rằng không phải tất cả các định dạng đều có thể được đính kèm làm mục tiêu hiển thị. Ví dụ. bạn không thể đính kèm định dạng độ sáng và cường độ.

Ngoài ra không phải tất cả phần cứng đều hỗ trợ lọc kết cấu điểm nổi, vì vậy bạn cần kiểm tra phần đầu tiên cho trường hợp của mình nếu cần.

Hy vọng điều này sẽ hữu ích.