2012-07-02 28 views
7

Tôi đang đấu tranh để có được những thuật toán đơn giản tới làm việc tại Samsung Galaxy SIIINoise Thuật toán thất bại trong Samsung Galaxy SIII (GLES)

float rand(vec2 co) 
{ 
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); 
} 

.... 
vec3 color = texture2D(u_texture, v_texcoord); 
gl_FragColor.rgb = color + vec3(rand(gl_FragCoord.xy + time/1000.0)); 
.... 

Mã này tạo ra một cách hoàn hảo tiếng ồn dự kiến ​​trong Samsung Galaxy S1 và Google Nexus S Nhưng nó không hoàn toàn trong điện thoại thông minh mới sử dụng ARM của Mali-400/MP4.

Bất kỳ ai cũng có thể phát hiện bất kỳ điều gì sai với thuật toán này? Hoặc có thể hiểu tại sao nó có thể thất bại?

+2

Không thế nào? Bạn đang kiểm tra thông tin lỗi/cảnh báo? – Tim

+0

Không có lỗi nào cả, chỉ đơn giản là không hiển thị bất kỳ điểm ảnh nhiễu nào. Hình ảnh tổng thể là ok, nhưng không có bất kỳ tiếng ồn nào. – PerracoLabs

+2

Hmm, không chắc chắn sau đó. Tôi chỉ khuyên bạn nên lột nó trở lại một lớp tại một thời điểm cho đến khi bạn có thể hiểu tại sao. Ví dụ. hiện fract() làm việc? làm gãy xương (sin()) làm việc, hiện fract (sin (dot (())) làm việc? vv – Tim

Trả lời

9

Sự cố của bạn có thể xuất phát từ việc lấy số sin của một số lớn. Kết quả của việc này phụ thuộc vào việc thực hiện chính xác sin, không có sẵn. Rõ ràng, chức năng sin được sử dụng bởi chip Mali có kết quả dự đoán nhiều hơn với số lượng lớn hơn các kết quả khác.

Dường như với tôi rằng bạn nên sử dụng an actual noise function, không phải điều này. Ít nhất nó sẽ có kết quả dự đoán được trên phần cứng.

+1

Tôi đã thử tùy chọn này như tôi mặc dù sẽ là tốt nhất, và tôi đã có kết quả rất lạ. Tôi đã sử dụng thư tiếp theo từ thư viện: https://github.com/ashima/webgl-noise/blob/master/src/noise2D.glsl – PerracoLabs

3

Một chút thảo luận về sự cố này trên diễn đàn ARM: http://forums.arm.com/index.php?/topic/16364-random-number-with-mali-400-mp/.

Vấn đề là do độ chính xác của FP16 trong trình đổ bóng phân đoạn trên GPU Mali. Về cơ bản, không có bit phân số còn lại vào thời điểm fract được gọi (vì các số nhân quá lớn), do đó bạn không nhận được bất kỳ "nhiễu" nào cả. Nếu bạn tạo các hằng số nhỏ hơn, bạn sẽ bắt đầu nhận được các giá trị khác 0, nhưng chúng sẽ không ồn ào. (Tôi không hoàn toàn chắc chắn làm thế nào các giá trị được chọn, và not clear where this algorithm came from của nó).

Về mặt kỹ thuật thuật toán tiếng ồn này dựa vào các hoạt động điểm nổi chính xác cao hơn (trung bình? Cao?), Tùy chọn trong trình đổ bóng phân đoạn. Theo this other post bạn có thể kiểm tra độ chính xác được hỗ trợ của nền tảng trong trình đổ bóng phân đoạn bằng cách kiểm tra phần mở rộng "OES_fragment_precision_high" trong glGetString(GL_EXTENSIONS).

Dự án webgl-noise trong câu trả lời của Nicol dường như không dễ bị các vấn đề cắt ngắn điểm nổi (dường như giữ mọi thứ trong giới hạn chặt hơn). Tuy nhiên, nó có một khoảng thời gian khoảng 300, và nó tạo ra nhiều "cấu trúc" tiếng ồn hơn là tiếng ồn "trắng" (hoặc "màu hồng") bạn hiện đang nhận được. Một thư viện tuyệt vời của nó, tuy nhiên, do đó, giá trị của nó làm việc vào mã của bạn ngay cả khi nó không phải là một thay thế thả vào.

+0

Tôi đã sử dụng thư viện webgl-noise , mặc dù tôi vẫn đang cố gắng tìm một giải pháp thay thế, vì thuật toán quá lớn và đôi khi đôi khi (nhiều hơn tôi muốn) tạo ra nhiễu không hoàn toàn là tiếng ồn, đặc biệt khi trộn với màu tối. bên cạnh dự án nhiễu webgl, tôi đã không tìm thấy bất kỳ phương án thay thế nào. – PerracoLabs

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