2012-05-14 20 views
5

Tôi gặp sự cố rất đáng lo ngại với sự lóa trong WebGL.Trình vẽ WebGL GLSL: truy cập texture2D ghi đè lên kết cấu khác

shader này hoạt động như mong đợi:

uniform sampler2D tColor; 
uniform sampler2D tNormal; 
varying vec2 vUv; 

void main() { 
    gl_FragColor = texture2D(tColor, vUv); 
} 

Nhưng, lần này cư xử tổng khác nhau:

uniform sampler2D tColor; 
uniform sampler2D tNormal; 
varying vec2 vUv; 

void main() { 
    vec4 test = texture2D(tNormal, vUv); 
    gl_FragColor = texture2D(tColor, vUv); 
} 

Bằng cách truy cập vào kết cấu tNormal, kết cấu tColor được ghi đè. Sao có thể như thế được?

+2

Không thể thực hiện được. Bạn có thể đặt mã phía khách hàng của bạn (kết cấu, shaders, ràng buộc, vv), để đảm bảo rằng không có gì không chính xác đang xảy ra ở đó? – Tim

+0

Bạn thấy nền tảng này trên nền tảng nào? Chrome ANGLE/OpenGL, FF, Win, Mac, v.v.? Và bạn có chắc rằng kết cấu màu của bạn không bị ràng buộc với mục tiêu hiển thị không? – MikaelEmtinger

Trả lời

7

Tôi đã thấy hành vi tương tự trong quá khứ và hầu như luôn luôn là vì tôi ràng buộc kết cấu của mình không đúng cách. Vụ việc gần đây nhất đã xảy ra khi tôi đã cố gắng để ràng buộc textures tôi như vậy:

gl.activeTexture(gl.TEXTURE0); 
gl.bindTexture(gl.TEXTURE_2D, colorTexture); 
gl.uniform1i(colorUniform, gl.TEXTURE0); 

gl.activeTexture(gl.TEXTURE1); 
gl.bindTexture(gl.TEXTURE_2D, normalTexture); 
gl.uniform1i(normalUniform, gl.TEXTURE1); 

Khi cú pháp đúng là thực sự:

gl.activeTexture(gl.TEXTURE0); 
gl.bindTexture(gl.TEXTURE_2D, colorTexture); 
gl.uniform1i(colorUniform, 0); // 0 to indicate texture unit 0! 

gl.activeTexture(gl.TEXTURE1); 
gl.bindTexture(gl.TEXTURE_2D, normalTexture); 
gl.uniform1i(normalUniform, 1); // 1 to indicate texture unit 1! 

Đây là một sai lầm khá phổ biến, và không may WebGL không thực sự ném một lỗi trên đoạn mã đầu tiên (chủ đề của cuộc thảo luận gần đây trong danh sách gửi thư trên WebGL) và nó có thể xuất hiện để hoạt động trong các trường hợp giới hạn, do đó rất dễ nhầm lẫn rằng đó là mã hợp lệ.

Tôi không biết đây có phải là vấn đề cụ thể của bạn hay không, nhưng đó có thể là lời khuyên tốt nhất mà tôi có thể cung cấp mà không có thêm chi tiết.

+2

lưu ý: tình huống này sẽ tạo ra lỗi trong cả Chrome và Firefox mới nhất và hiện là một phần của các thử nghiệm tuân thủ WebGL – gman

+0

Đó là giải pháp, cảm ơn bạn! – Torsten

+0

Rất vui khi nó hoạt động! @gman: Thật tuyệt vời! Tôi biết rằng nó đã được thảo luận nhưng tôi không bao giờ nghe nói rằng nó đã thực sự được thực hiện. – Toji

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