2012-05-03 34 views
7

GLSL có bất kỳ hằng số được xác định trước nào cho +/- vô cùng hoặc NaN không? Tôi đang làm điều này như một cách giải quyết nhưng tôi tự hỏi, nếu có một cách sạch hơn:hằng số vô hạn glsl

// GLSL FRAGMENT SHADER 
#version 410 

<snip> 

const float infinity = 1./0.; 

void main() 
{ 
    <snip> 
} 

Tôi nhận thức được isinf chức năng nhưng tôi cần phải gán vô cho một biến để điều đó không giúp tôi.

+0

Bạn cần gì vô cùng? – Shahbaz

+0

Sử dụng vô cực tiết kiệm rất nhiều logic trong mã của tôi: ' float t0 = (d> = 0.)? t: vô cùng; float t1 = (d> = 0.)? t: vô cùng; t = min (t0, t1); ' – atb

+0

Tôi tin rằng việc chọn một giá trị đủ lớn (dựa trên ứng dụng của bạn) sẽ dễ dàng thực hiện thủ thuật. Nói ví dụ '1e20' – Shahbaz

Trả lời

5

Giống như Nicol được đề cập, không có hằng số được xác định trước.

Tuy nhiên, từ OpenGL 4.1 trở đi, giải pháp của bạn ít được đảm bảo để hoạt động và tạo ra một giá trị vô hạn.

Xem ví dụ trong glsl 4.4:

4.7.1 Phạm vi và chính xác

...

Tuy nhiên, chia một tổ chức phi-zero của 0 kết quả trong một cách thích hợp đã ký IEEE Inf: Nếu cả hai số 0 dương và âm được thực hiện, thì Inf được ký chính xác sẽ được tạo, nếu không pos itive Inf được tạo ra.

Hãy cẩn thận khi bạn sử dụng một phiên bản cũ của OpenGL mặc dù:

Ví dụ trong glsl 4.0 nó nói:

4.1.4 Floats

...

Tương tự, xử lý các điều kiện như chia cho 0 ma y dẫn đến kết quả không xác định, nhưng trong mọi trường hợp, điều kiện như vậy sẽ dẫn đến gián đoạn hoặc chấm dứt xử lý.

3

Không có hằng số được xác định trước cho nó, nhưng có chức năng isinf để kiểm tra xem có điều gì đó vô hạn hay không.

Trong khi tôi đang ở đó, có hằng số cho những thứ khác như FLT_MAX FLT_EPSILON v.v ... theo cách có trong C không?

Không, không có.