Теневой объем OpenGLES

#ios #opengl-es #opengl-es-2.0

#iOS #opengl-es #opengl-es-2.0

Вопрос:

Я успешно реализовал теневой объем на iOS.

Однако у меня возникла следующая проблема: как я могу обрезать положение вершины до дальней плоскости, как это делает NV_depth_clamp в GLSL? это мой код вершинного шейдера:

 void main( void ) { 

highp vec3 eyepos = vec3( MODELVIEW * vec4( VERTEX, 1.0 ) );

normal = normalize( NORMALMATRIX * NORMAL );

highp vec3 ldir = normalize( LIGHTPOS - eyepos );

highp float ndotl = max( dot( normal, ldir ), 0.0 );

// How can I clip that to the far plane automatically!??!!?
if( ndotl > 0.0 ) gl_Position = PROJECTION * vec4( eyepos   ( ldir * -2000.0 ), 1.0 );

else  gl_Position = PROJECTION * vec4( eyepos, 1.0 );
}
  

Во-вторых, при поиске проблемы, описанной выше, я обнаружил, что метод zfail теневого тома (который я реализую) запатентован, это правда? означает ли это, что я не могу использовать его в коммерческом приложении в App Store?

ТИА!

Ответ №1:

Ура, на дальней плоскости клипа z / w = 1. Итак, вам нужно преобразовать оба eyepos и ldir с помощью проекции, а затем добавить столько ldir в eyepos, чтобы он оказался в дальней плоскости. Это может быть сложно, потому что дальняя плоскость обрезки может обрезать ваши полигоны, если они лежат точно на ней, поэтому может потребоваться некоторая настройка.