WebGL: указание точности float во фрагментном шейдере

Автор Тема: WebGL: указание точности float во фрагментном шейдере  (Прочитано 8184 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Почему во фрагментном шейдере необходимо указывать точность (иначе не будет работать), в то время как в вершинном работает и без этого?

Код - C++ [Выбрать]
  1. // vertex.shader file
  2. // precision mediump float;
  3. attribute vec4 a_Position;
  4. attribute float a_PointSize;
  5.  
  6. void main(){
  7.   gl_Position = a_Position;
  8.   gl_PointSize = a_PointSize;
  9. }

Код - C++ [Выбрать]
  1. // fragment.shader file
  2. precision mediump float;
  3. uniform vec4 u_FragColor;
  4.  
  5. void main(){
  6.   gl_FragColor = u_FragColor;
  7. }
Если во втором примере я закомментирую 2-ю строку, то работать не будет.

Отмечено как Решение Андрей Бушман 16-02-2015, 15:23:58

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Этого требует стандарт GLSL ES, в то время как стандарт "большого" GLSL (не ES) этого не требует. Если в вершинном шейдере не указана точность типов с плавающей точкой, то по умолчанию используется точность highp. Если бы фрагментный шейдер в качестве значения по умолчанию имел highp, то это могло бы привести к проблемам, т.к. OpenGL ES 2.0 не требует наличия поддержки высокой точности значений с плавающей точкой во фрагментном шейдере.

Цитировать
OpenGL ES Shading Language - 4. Variables and Types - pp. 35-36

The fragment language has no default precision qualifier for floating point types. Hence for float, floating point vector and matrix variable declarations, either the declaration must include a precision qualifier or the default float precision must have been previously declared.

4.5.4 Available Precision Qualifiers

The built-in macro GL_FRAGMENT_PRECISION_HIGH is defined to one on systems supporting highp precision in the fragment language

Код - C++ [Выбрать]
  1. #define GL_FRAGMENT_PRECISION_HIGH 1

and is not defined on systems not supporting highp precision in the fragment language. When defined, this macro is available in both the vertex and fragment languages. The highp qualifier is an optional feature in the fragment language and is not enabled by #extension.