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.
Bạn đã thử sử dụng định dạng hình ảnh thực thay vì 'GL_RED'? –
@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? –
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). –