2012-03-19 41 views
22

Trong shader đoạn của tôi, tôi có thể tải một kết cấu, sau đó làm điều này:Cách lấy thông tin pixel bên trong trình đổ bóng phân đoạn?

uniform sampler2D tex; 

void main(void) { 
    vec4 color = texture2D(tex, gl_TexCoord[0].st); 
    gl_FragColor = color; 
} 

Đó đặt pixel hiện nay với giá trị màu sắc của kết cấu. Tôi có thể sửa đổi chúng, vv và nó hoạt động tốt.

Nhưng một vài câu hỏi. Làm thế nào để tôi biết "tôi là" pixel nào? Ví dụ: giả sử tôi muốn đặt pixel 100,100 (x, y) thành màu đỏ. Mọi thứ khác với màu đen. Làm cách nào để tôi thực hiện:

"nếu currentSelf.Position() == (100,100); sau đó color = red; else color = black?"

?

Tôi biết cách đặt màu, nhưng làm cách nào để có được vị trí "của tôi"?

Thứ hai, làm cách nào để nhận các giá trị từ pixel lân cận?

Tôi cố gắng này:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st); 

Nhưng không rõ ràng những gì nó đang trở lại? nếu tôi là pixel 100,100; làm thế nào để tôi nhận được các giá trị từ 101.100 hoặc 100.101?

Trả lời

28

Làm cách nào để cho biết tôi là "pixel" nào?

Bạn không phải là pixel. Bạn là một mảnh . Có một lý do mà OpenGL gọi họ là "Fragment shaders"; đó là vì chúng không phải là pixel chưa. Thật vậy, không chỉ chúng có thể không bao giờ trở thành pixel (thông qua các bài kiểm tra discard hoặc sâu) hoặc bất kỳ điều gì), nhờ ghép nhiều phần, nhiều đoạn có thể kết hợp để tạo thành đơn pixel.

Nếu bạn muốn biết vị trí trình đổ bóng phân đoạn của bạn nằm trong không gian cửa sổ, hãy sử dụng gl_FragCoord. Vị trí phân mảnh là các giá trị dấu phẩy động, không phải là số nguyên, do đó bạn phải thử nghiệm với một dải thay vì một giá trị "100, 100" đơn lẻ.

Thứ hai, làm cách nào để nhận giá trị từ pixel lân cận?

Nếu bạn đang nói về điểm ảnh framebuffer lân cận, bạn không. Trình đổ bóng phân đoạn không thể đọc được tùy ý từ bộ đệm khung, ở vị trí riêng của chúng hoặc ở vị trí lân cận.

Nếu bạn đang nói về việc truy cập một số lân cận texel từ trang bạn đã truy cập, thì đó chỉ là vấn đề xu hướng phối cảnh mà bạn chuyển đến texture2D. Bạn phải lấy kích thước của texture (vì bạn không sử dụng GLSL 1.30 hoặc cao hơn, bạn phải tự chuyển nó vào), đảo ngược kích thước và cộng hoặc trừ các kích cỡ này từ thành phần S và T của tọa độ kết cấu .

+1

đánh bại tôi vào nó; tất cả những gì tôi phải nói là khác với một chút so với đây là liên kết http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml, nó đi vào chi tiết hơn một chút về 'gl_FragCoord' và đề xuất của một trung gian hiển thị kết cấu nếu anh ta thực sự muốn tính các đoạn đầu ra dựa trên sự kết hợp của nhiều pixel lân cận trong bộ đệm đầu ra khác. – Tommy

+0

Về cơ bản những gì tôi muốn làm, là nếu pixel x, y có hàng xóm có màu đỏ trong chúng, để tăng màu đỏ trong x, y. Có hướng dẫn nào giải thích cách thực hiện điều này không? – user697111

+2

@ user697111: Bạn muốn triển khai bộ lọc "giãn nở" hoạt động trên kênh màu đỏ của kết cấu. Google những từ khóa và bạn sẽ tìm thấy rất nhiều. – datenwolf

0

Dễ dàng peasy.

Chỉ tính kích thước pixel dựa trên độ phân giải. Sau đó tìm kiếm +1 và -1.

vec2 onePixel = vec2(1.0, 1.0)/u_textureSize; 
gl_FragColor = (
    texture2D(u_image, v_texCoord) + 
    texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) + 
    texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0)))/3.0; 

Có một ví dụ điển hình here

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