2011-10-14 25 views
11

Tôi đang chuyển một kết cấu có kích thước NxM làm mẫu trong trình đổ bóng đoạn GLSL (OpenGL ES 2.0). Cách đúng để đọc dữ liệu texel từ texel lân cận là gì? Tôi không có tọa độ kết cấu "thay đổi" trong trình đổ bóng phân đoạn. Tôi chỉ có thể sử dụng phân đoạn mảnh để đọc thông tin về kết cấu.Trong OpenGL ES 2.0, Làm thế nào để đọc các phần tử lân cận từ một Sampler?

Sau đây là đổ bóng của tôi, tôi không chắc chắn nếu nó thực sự đọc dữ liệu:

precision mediump float; 

uniform sampler2D Sampler; 

#define OFFSET 1.0 

void main() 
{ 

    vec2 T = gl_FragCoord.xy; 

    //Find neighboring velocities: 
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+OFFSET)).xy; 
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-OFFSET)).xy; 
    vec2 E = texture2D(Sampler,vec2(T.x+OFFSET,T.y)).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-OFFSET,T.y)).xy; 
} 

Là giá trị OFFSET nên là 1.0 hay cái gì khác cho kết cấu kích thước NxM?

+0

Chính xác thì bạn đang cố gắng làm gì ở đây? – IDWMaster

+0

@IDWMaster Tôi đoán truy cập các giá trị texel lân cận, như ông nói. Tôi không biết có cái gì đó không rõ ràng hoặc nếu nó quan trọng những gì anh ta thực sự muốn đạt được cuối cùng. –

+0

Chào mừng bạn đến với StackOverflow, tôi hy vọng bạn đọc [FAQ] (http://stackoverflow.com/faq#howtoask). –

Trả lời

14

Nem đúng trong câu trả lời của mình rằng tọa độ kết cấu phải nằm trong [0,1]. Nhưng hãy nhớ rằng các giá trị của gl_FragCoord nằm trong [0, N] x [0, M] (giả sử khung nhìn của bạn cũng là NxM). Vì vậy, bạn là chính xác trong việc thêm một bù đắp từ 1 đến đoạn phối hợp, nhưng số tiền này có sau đó được chia cho kích thước màn hình (mà có lẽ là giống với kích thước kết cấu):

precision mediump float; 

uniform sampler2D Sampler; 
uniform vec2 invScreenSize; 

void main() 
{ 

    vec2 T = gl_FragCoord.xy; 

    //Find neighboring velocities: 
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+1.0)*invScreenSize).xy; 
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-1.0)*invScreenSize).xy; 
    vec2 E = texture2D(Sampler,vec2(T.x+1.0,T.y)*invScreenSize).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-1.0,T.y)*invScreenSize).xy; 
} 

nơi invScreenSize là kích thước màn hình đối ứng (1/N, 1/M), để ngăn phân chia trong trình đổ bóng.

+0

Cảm ơn các bạn, nó hoạt động ngay bây giờ. Bản thân đặc tả ngôn ngữ Shading ES của OpenGL không rõ ràng khi sử dụng texture2D. – kal21

+1

@ kal21 Trong thực tế, mọi hướng dẫn OpenGL giới thiệu nên cho bạn biết rằng các kết cấu được truy cập bằng tọa độ kết cấu chuẩn hóa trong [0,1]. –

4

Tôi khá chắc chắn rằng trong OpenGL ES 2.0 tất cả tọa độ kết cấu là nổi giữa 0.0 và 1.0, vì vậy việc thêm 1.0 sẽ sai, và có thể sẽ chỉ quấn quanh vị trí chính xác tương tự. Giá trị x của bạn phải là 1.0/N và giá trị chênh lệch y của bạn phải là 1.0/M (dựa trên câu lệnh NxM của bạn). Tôi không tự tin rằng đây là giải pháp tốt nhất, nhưng tôi đã sử dụng nó để giải quyết một vấn đề tương tự.

Tôi khuyên bạn nên kiểm tra đặc tả Ngôn ngữ Shading của OpenGL ES để xác minh rằng xác nhận quyền sở hữu của tôi về định dạng tọa độ kết cấu là chính xác (tôi đã thực hiện việc này vài tháng trước). Đó là một pdf dễ tìm với google, và có một danh sách thuận tiện của tất cả các chức năng tích hợp ở đâu đó.

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