Đâ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.
Chúng cũng hữu ích khi nhận dữ liệu cho trình đổ bóng (ví dụ: isovalues). – pmr
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
@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