2011-03-20 36 views
42

Biến mà bạn đang nhồi nhét các giá trị vào quy định độ chính xác mà bạn đang làm việc, ở bên phải dấu bằng?Trong OpenGL ES 2.0/GLSL, bạn cần thông số chính xác ở đâu?

Ví dụ, là có bất kỳ sự khác biệt, ý nghĩa, với độ chính xác specifier đây:

gl_FragColor = lowp vec4(1); 

Dưới đây là một ví dụ khác:

lowp float floaty = 1. * 2.; 
floaty = lowp 1. * lowp 2.; 

Và nếu bạn mất một phao nổi, và tạo ra một vector hoặc ma trận từ chúng, liệu vector hoặc ma trận đó có dựa trên độ chính xác của các giá trị mà bạn làm với nó hay các giá trị đó có chuyển thành một mức độ chính xác khác không?

Tôi nghĩ rằng việc tối ưu hóa này sẽ trả lời tốt nhất các câu hỏi:

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal) 

Ý tôi là, nó cần phải đi xa này, nếu bạn muốn nó càng nhanh càng tốt, hoặc là một số của nó vô dụng?

lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal) 

Tôi biết bạn có thể xác định độ chính xác mặc định cho phao và điều này được cho là được sử dụng cho vectơ và ma trận sau đó. Giả sử với mục đích giáo dục, mà chúng tôi đã định nghĩa này trước đây:

precision highp float; 

Trả lời

60
  1. Bạn không cần specifiers chính xác trên hằng số/chữ từ những có được thời gian biên dịch đánh giá để bất cứ điều gì họ đang được giao nhiệm vụ. Hơn nữa, vì độ chính xác của gl_FragColor đã được xác định dựa trên độ sâu của mục tiêu hiển thị, độ chính xác mà bạn gán cho nó không quan trọng.

  2. Trong các vertex shader thì độ chính xác sau được khai báo theo mặc định: (4.5.3 Default Precision Qualifiers)

    precision highp float; 
    precision highp int; 
    precision lowp sampler2D; 
    precision lowp samplerCube; 
    

    Và trong shaders đoạn bạn nhận được:

    precision mediump int; 
    precision lowp sampler2D; 
    precision lowp samplerCube; 
    

    Điều này có nghĩa rằng nếu bạn khai báo một phao trong một shader fragment, bạn phải nói rằng nó là một lowp hoặc một mediump. Các số liệu float/int mặc định cũng mở rộng thành ma trận/vectơ.

  3. highp chỉ được hỗ trợ trên các hệ thống có macro GL_FRAGMENT_PRECISION_HIGH được xác định là 1; về phần còn lại bạn sẽ nhận được một lỗi trình biên dịch. (4.5.4 Available Precision Qualifiers)

  4. Quy tắc cho độ chính xác trong biểu thức là chúng được tự động truyền tới loại của nhiệm vụ/tham số mà chúng được ràng buộc. Vì vậy, đối với dấu chấm của bạn, nó sẽ sử dụng độ chính xác của các loại đầu vào theo mặc định và thêm lowp là không cần thiết (và cú pháp không chính xác). Nếu bạn muốn hạ xuống một loại với độ chính xác thấp hơn, cách duy nhất để làm điều đó là gán nó một cách rõ ràng với độ chính xác thấp hơn.

Các câu trả lời này là tất cả từ đặc điểm Khronos GLSL mà bạn có thể tìm thấy ở đây (các phần có liên quan là 4.5.2 và 4.5.3): http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

+5

"Hơn nữa, vì độ chính xác của gl_FragColor đã được xác định dựa trên độ sâu của mục tiêu hiển thị" nguồn của bạn cho câu lệnh này là gì? Tôi không thấy bất kỳ thông tin về điều này trong spec. – eodabash

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