2012-04-07 37 views
5

Tôi đang cố gắng để lấy mẫu một kết cấu số nguyên từ shader hình học của tôi chạy trên GeForce 330m. Có vẻ như trả lại các giá trị khác so với tôi tải vào kết cấu. Tôi sử dụng mã này (về cơ bản) để tạo và tải các kết cấu:Opengl Hình học shader số nguyên kết cấu lấy không thành công

glGenTextures(1, &textureId); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_INT, <some 0-initialized large enough buffer>); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
    int data[] = { 3, 0, 36, 400 }; 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 3, 1, 1, GL_RGBA, GL_INT, data); 
glBindTexture(GL_TEXTURE_2D, 0); 

Ý tưởng là một pixel trong cụ thể được thiết lập để có một w-giá trị 400. sau đó tôi sử dụng này trong shader hình học của tôi:

#version 330 
#extension GL_EXT_gpu_shader4 : require 
uniform isampler2D models; 

void main() 
{ 
    ivec4 modelstats4 = texelFetch2D(models, ivec2(0, 3), 0); 
// ivec4 modelstats4 = ivec4(3, 0, 36, 400); 
    if (modelstats4.w > height) { 
     // emit something 
    } 
} 

Sử dụng giá trị cố định đã nhận xét phải bằng kết quả trong một thứ được phát ra (IE, một điểm). Nếu tôi sử dụng thực tế texel lấy nó không trả lại bất cứ điều gì. Tất cả các giá trị mà tôi biết về điều đó có thể có tác động bây giờ đã được mã hóa cứng nên tôi mất mát vì sao nó không hoạt động. Đây không phải là mã đầy đủ (thiết lập OO, khá nhiều để xem xét) nhưng đây là các cuộc gọi OpenGL có liên quan với dữ liệu hiện hành.

+0

Bạn nên trả lời câu hỏi của mình hoặc xóa câu hỏi. Bởi vì nó chỉ giữ vị trí trong danh sách câu hỏi chưa được trả lời :) – kravemir

+0

Cảm ơn Miro, không biết điều đó. – dascandy

Trả lời

4

Tìm thấy giải pháp thông qua việc rót tự do của glGetErrors. Lỗi trong mỗi glTexImage trong ví dụ mã này - dường như, đối với một kết cấu số nguyên, bạn không được sử dụng GL_RGBA nhưng GL_RGBA_INTEGER.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data); 

Điều này hiện hoạt động. Kết quả tìm nạp cũng OK.