2013-02-19 34 views
9

Tôi đang cố gắng triển khai sơ đồ truyền tải bát độ bằng cách sử dụng OpenGL và GLSL và muốn giữ dữ liệu ở dạng kết cấu. Trong khi có một số lượng lớn các định dạng để sử dụng cho dữ liệu kết cấu (float và số nguyên có kích thước khác nhau), tôi có một số vấn đề trong việc tìm ra cách để kiểm soát chính xác hơn các bit. Đây có thể là vấn đề chung, không chỉ áp dụng cho OpenGL và GLSL.Kiểm soát chính xác các bit kết cấu trong GLSL

Là ví dụ về đồ chơi đơn giản, giả sử rằng tôi có một texel chứa số nguyên 16 bit. Tôi muốn mã hóa hai boolean của 1 bit mỗi, một giá trị số nguyên 10 bit và sau đó một giá trị số nguyên 4 bit vào texel này. Có một kỹ thuật để mã hóa điều này khi tạo kết cấu không, sau đó giải mã các thành phần này khi lấy mẫu kết cấu bằng cách sử dụng trình đổ bóng GLSL?

Chỉnh sửa: Có vẻ như tôi đang thực sự tìm kiếm các kỹ thuật thao tác bit. Vì chúng dường như được hỗ trợ, tôi nên ổn sau khi nghiên cứu thêm.

+0

Bạn đang hỏi làm thế nào để làm thao tác bit? –

+0

Thao tác bit là có thể trong GLSL 1.3 (OpenGL 3.0), tôi không biết làm thế nào bạn có thể đọc int thô từ kết cấu trong GLSL tuy nhiên ... Texture2D trả về float vec4 –

+0

@NicolBolas: Sau khi tìm kiếm thêm, có vẻ như Tôi là. Tôi đã không làm điều đó rất nhiều, vì vậy tôi không chắc chắn. Nếu GLSL hỗ trợ nó, tôi sẽ có thể tìm ra nơi để bắt đầu tìm hiểu về nó! –

Trả lời

3

Số nguyên và thao tác bit bên trong trình đổ bóng GLSL được hỗ trợ vì OpenGL 3 (do đó xuất hiện trên phần cứng lớp DX10, nếu điều đó cho bạn biết thêm). Vì vậy, bạn chỉ có thể làm điều này bit chính trên của riêng bạn bên trong bóng đổ.

Nhưng làm việc với các số nguyên là một điều, nhận chúng ra khỏi kết cấu là một thứ khác. Các định dạng kết cấu OpenGL chuẩn (mà bạn có thể sử dụng để) hoặc là lưu trữ trực tiếp các giá trị (như GL_R16F) hoặc các giá trị điểm cố định chuẩn hóa (như GL_R16, các số nguyên hiệu quả đối với không được khởi tạo;)), nhưng đọc từ chúng (sử dụng texture, texelFetch hoặc bất cứ điều gì) sẽ net bạn float giá trị trong bóng đổ, từ đó bạn có thể không dễ dàng hoặc đáng tin cậy suy ra các bit ban đầu mẫu của số nguyên được lưu trữ nội bộ.

Vì vậy, những gì bạn thực sự cần sử dụng là kết cấu số nguyên, cũng yêu cầu OpenGL 3 (hoặc có thể là phần mở rộng GL_EXT_texture_integer, nhưng phần cứng hỗ trợ có khả năng sẽ có GL3). Vì vậy, đối với kết cấu của bạn, bạn cần phải sử dụng định dạng nội bộ số nguyên thực tế, chẳng hạn như ví dụ: GL_R16UI (đối với số nguyên không dấu 16 bit 1 thành phần) theo định dạng điểm cố định thông thường (ví dụ: GL_R16 cho độ chính xác [0,1] màu với độ chính xác 16 bit).

Và sau đó trong trình đổ bóng, bạn cần phải sử dụng một loại mẫu số nguyên, như ví dụ: usampler2D cho một kết cấu 2D unsigned integer (và tương tự như vậy isampler... cho các biến thể đã ký) để thực sự có được một số nguyên unsigned từ texture hoặc texelFetch bạn gọi:

CPU:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, ..., GL_R, GL_UNSIGNED_SHORT, data); 

GPU:

uniform usampler2D tex; 

... 
uint value = texture(tex, ...).r; 
bool b1 = (value&0x8000) == 0x8000, 
    b2 = (value&0x4000) == 0x4000; 
uint i1 = (value>>4) & 0x3FF, 
    i2 = value & 0xF; 
+0

Xin chào, glTexImage2D đang trả về lỗi cho tôi, bạn có thể vui lòng xem không? http://stackoverflow.com/questions/21625709/jogl-creating-only-red-channel-u16-but-getting-texture-type-and-format-combina – elect

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