2013-06-09 42 views
6

Tôi muốn di chuyển khởi tạo kết cấu 3D của tôi từ CPU sang GPU. Là một thử nghiệm, tôi đã viết một trình đổ bóng để đặt tất cả các voxels thành một giá trị không đổi, nhưng kết cấu không được sửa đổi chút nào. Làm thế nào để làm cho nó hoạt động?Tính năng đổ bóng không sửa đổi kết cấu 3d

Tính shader:

#version 430 

layout(local_size_x=1, local_size_y=1, local_size_z=1) in; 
layout(r8, location = 0) uniform image3D volume; 

void main() 
{ 
    imageStore(volume, ivec3(gl_WorkGroupID), vec4(0)); 
} 

Invocation:

glEnable(GL_TEXTURE_3D); 
glActiveTexture(GL_TEXTURE0); 
glGenTextures(1, &volume_tid); 
glBindTexture(GL_TEXTURE_3D, volume_tid); 
glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, volume_dims[0], volume_dims[1], volume_dims[2], 0, GL_RED, GL_UNSIGNED_BYTE, voxels); 

ShaderProgram computeVolumeShader; 
computeVolumeShader.loadShader(GL_COMPUTE_SHADER, "compute_volume.glsl"); 
computeVolumeShader.link(); 
computeVolumeShader.use(); 
computeVolumeShader.uniform("volume", 0); 
glBindImageTexture(0, volume_tid, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R8); 
glDispatchCompute(volume_dims[0], volume_dims[1], volume_dims[2]); 
glBindImageTexture(0, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R8); 
computeVolumeShader.unUse(); 
glMemoryBarrier(GL_ALL_BARRIER_BITS); 

Lưu ý: voxels đưa vào glTexImage3D chứa CPU khởi tạo dữ liệu.

+0

Bạn đã thử sử dụng định dạng hình ảnh thực thay vì 'GL_RED'? –

+0

@Nicol Khi tôi sử dụng 'GL_R8UI', tôi không thấy gì nữa, ngay cả khi không có bóng đổ tính toán. Tôi sử dụng 'sampler3D' để dựng hình, điều đó có tạo nên sự khác biệt không? Vì 'GL_RED' được liệt kê [ở đây] (http://www.opengl.org/sdk/docs/man/xhtml/glTexImage3D.xml) trong bảng 1, tôi nghĩ có thể sử dụng nó không? Bạn đang nói về tham số 'internalFormat', đúng không? –

+0

Nhưng bạn không biết những gì 'GL_RED' sẽ thực sự có ý nghĩa. Nó có thể cung cấp cho bạn 'GL_R8'. Nó có thể cung cấp cho bạn 'GL_R16'. Khi bạn không chọn định dạng * cụ thể *, bạn từ bỏ quyền chọn định dạng. Và nó ngừng hoạt động khi bạn sử dụng 'GL_R8UI' vì bạn có thể đã không đặt chuyển pixel của mình thành [dữ liệu tích phân tải lên thay vì phao được chuẩn hóa] (http://www.opengl.org/wiki/Pixel_Transfer#Integer_format). –

Trả lời

13

Ugh. Vì vậy, dường như một kết cấu 3D đã bị ràng buộc như lớp, nếu không thì trình đổ bóng không thể sửa đổi bất kỳ tọa độ uvw nào với w> 0.

glBindImageTexture(0, volume_tid, 0, /*layered=*/GL_TRUE, 0, GL_READ_WRITE, GL_R8); 

thực hiện thủ thuật.

+0

danke schön! :) –

+1

Tôi mất nửa ngày để làm điều này. Cảm ơn bạn!!! Tôi không nghĩ rằng tôi có thể đã tìm ra nó. –

+0

Cũng đã dành một chuyến du ngoạn điên rồ thông qua điều này. Điều này là siêu khó hiểu vì nó đã làm việc trên một Nvidia GM107 nhưng không GK110b (cả hai trình điều khiển mới nhất). : - / – FHoenig

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