2012-05-17 17 views
8

Trong khi sử dụng bộ nhớ texture tôi đã đi qua đoạn mã sau: -Texture cơ bản bộ nhớ tex2D

uint f = (blockIdx.x * blockDim.x) + threadIdx.x; 
uint c = (blockIdx.y * blockDim.y) + threadIdx.y; 

uint read = tex2D(refTex, c+0.5f, f+0.5f); 

Câu hỏi của tôi là tại sao chúng ta thêm 0.5f cho cả cf? Điều này gây nhầm lẫn cho tôi .. thankyou

Trả lời

14

Trong đồ họa, họa tiết là một tập hợp các mẫu mô tả bề ngoài hình ảnh của bề mặt. Một mẫu là một điểm. Nghĩa là, nó không có kích thước (trái ngược với một pixel có kích thước vật lý). Khi sử dụng mẫu để xác định màu của pixel, mỗi mẫu được định vị ở chính giữa của pixel tương ứng. Khi giải quyết các pixel với tọa độ số nguyên, trung tâm chính xác cho một pixel nhất định sẽ trở thành tọa độ số nguyên của nó cộng với độ lệch là 0,5 (trong mỗi thứ nguyên).

Nói cách khác, thêm 0,5 vào tọa độ kết cấu đảm bảo rằng, khi đọc từ các tọa độ đó, giá trị chính xác của mẫu cho pixel đó được trả về.

Tuy nhiên, chỉ khi filterMode cho kết cấu đã được đặt thành cudaFilterModeLinear, giá trị được đọc từ kết cấu thay đổi theo pixel. Trong chế độ đó, đọc từ các tọa độ không nằm trong tâm chính xác của pixel sẽ trả về các giá trị được nội suy giữa mẫu cho pixel đã cho và mẫu cho các pixel lân cận. Vì vậy, việc thêm 0,5 vào toàn bộ các tọa độ số hiệu quả sẽ phủ nhận chế độ cudaFilterModeLinear. Tuy nhiên, vì việc thêm 0,5 vào tọa độ kết cấu sẽ tạo ra các chu kỳ trong hạt nhân, tốt hơn là chỉ cần tắt nội suy bằng cách đặt filterMode thành cudaFilterModePoint. Sau đó, việc đọc từ bất kỳ tọa độ nào trong pixel sẽ trả lại giá trị mẫu kết cấu chính xác cho pixel đó và do đó, các mẫu kết cấu có thể được đọc trực tiếp bằng cách sử dụng các số nguyên.

Khi sử dụng cudaFilterModePoint, nếu có bất kỳ phép toán điểm động nào liên quan đến tính toán tọa độ kết cấu, phải đảm bảo rằng điểm không chính xác không gây ra tọa độ kết cấu nằm ngoài phạm vi cho pixel đích dự kiến.

Ngoài ra, như nhận xét đề cập, có thể có sự cố trong mã của bạn. Thêm 0,5f vào tọa độ kết cấu ngụ ý rằng chế độ cudaFilterModeLinear đang được sử dụng, nhưng chế độ đó trả về một phao, không phải là một int.

+0

Bạn nói rằng đối với các tọa độ kết cấu thực sự trỏ đến một trung tâm pixel vì vậy nếu chúng ta có thể truy cập phần tử với tọa độ 0,0 và sử dụng lược đồ của bạn, chúng tôi nhận được 1,1 pixel. – geek

+0

@ marina.k: Tôi không chắc ý bạn là gì. Có vấn đề gì với câu trả lời không? –

+0

@Roger Dahl Thankyou, câu trả lời rất hay. Nhưng bạn có thể giải thích khi bạn nói các điểm không chính xác nổi có thể khiến các tọa độ nằm ngoài phạm vi cho pixel đích dự định không? –

0

Tùy thuộc vào thuộc tính kết cấu, giá trị trả về bởi tex2D có thể được nội suy tuyến tính. Do đó, "chỉ số" fc không phải là số nguyên, nhưng giá trị liên tục giữa các giới hạn của mỗi thứ nguyên.

Điều gì là một chút lẻ trong ví dụ này là giá trị trả về là một số nguyên, sẽ làm cho bất kỳ hằng số piecewise tuyến tính tuyến tính nào.

Để biết thêm thông tin chi tiết, xem Phần 3.2.10 của Hướng dẫn lập trình CUDA.

+0

"' cudaFilterModeLinear' chỉ hợp lệ đối với giá trị trả lại của loại dấu phẩy động. ", Vì vậy ở đây chúng tôi không thể có nội suy, chỉ' cudaFilterModePoint' – aland

+0

@aland: Đúng vậy, nhưng chúng ta không biết loại nào 'refTex' được khai báo với, tức là' float' hoặc 'int' hoặc bất kỳ cái gì. – Pedro

+0

Nếu chúng tôi sử dụng tọa độ không từ 0,0 đến 1,0 thì không thể là 'cudaFilterModePoint' – geek

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