2013-04-08 4 views
2

Я использую эту простую функцию для рисования квадроциклов в 3D-пространстве, которое обращено к камере. Теперь я хочу использовать фрагментарный шейдер, чтобы нарисовать иллюзию сферы внутри. Но проблема в том, что я новичок в OpenGL ES, поэтому я не знаю, как это сделать?Как использовать фрагментарный шейдер для рисования сферической иллюзии в OpenGL ES?

void draw_sphere(view_t view) { 

    set_gl_options(COURSE); 

    glPushMatrix(); 
    { 
     glTranslatef(view.plyr_pos.x, view.plyr_pos.y, view.plyr_pos.z - 1.9); 
#ifdef __APPLE__ 
#undef glEnableClientState 
#undef glDisableClientState 
#undef glVertexPointer 
#undef glTexCoordPointer 
#undef glDrawArrays 

     static const GLfloat vertices []= 
     { 
      0, 0, 0, 
      1, 0, 0, 
      1, 1, 0, 
      0, 1, 0, 
      0, 0, 0, 
      1, 1, 0 
     }; 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glVertexPointer(3, GL_FLOAT, 0, vertices); 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 6); 
     glDisableClientState(GL_VERTEX_ARRAY); 
#else 
#endif 
    } 
    glPopMatrix(); 
} 

Более точно, я хочу, чтобы достичь этого: Enhancing Molecules using OpenGL ES 2.0

+0

В примере кода используются функции, которые поддерживаются только ES 1, ES 2 их не имеет. Но тогда ES 1 не имеет шейдеров. Итак, какая версия OpenGL ES вы нацеливаете? –

+0

Ну, я думаю, OpenGL ES 2. – miller

+0

Тогда ваш пример кода не будет работать, поскольку он использует только одну функцию, поддерживаемую OpenGL ES 2. –

ответ

5

Там может быть довольно много, что вам нужно, чтобы достичь этого ... сфера, которая рисуется на последнее изображение Размещенное Вами результат использования освещения, блеска и цвета. В общем, вам нужен шейдер, который может обрабатывать все это и может нормально работать для любой формы.

Этот конкретный случай (также некоторые другие, которые могут быть представлены математически) можно нарисовать с помощью одного квадроцикла, даже не требуя нажимать нормальные координаты на программу. Что вам нужно сделать, это создать нормальный в пиксельный шейдер: Если вы получаете векторы sphereCenter, fragmentPosition и плывут sphereRadius, то sphereNormal вектор, такой как

sphereNormal = (fragmentPosition-sphereCenter)/radius; //taking into account all have .z = .0 
sphereNormal.z = -sqrt(1.0 - length(sphereNormal)); //only if(length(spherePosition) < sphereRadius) 

и реальное положение сферы:

spherePosition = sphereCenter + sphereNormal*sphereRadius; 

Теперь все, что вам нужно сделать, это добавить ваше освещение. Статическое или нет, наиболее часто используется фактор окружающего фактора, линейный и квадратный коэффициенты расстояния, коэффициент блеска:

color = ambient*materialColor; //apply ambient 

vector fragmentToLight = lightPosition-spherePosition; 
float lightDistance = length(fragmentToLight); 
fragmentToLight = normalize(fragmentToLight); //can also just divide with light distance 
float dotFactor = dot(sphereNormal, fragmentToLight); //dot factor is used to take int account the angle between light and surface normal 
if(dotFactor > .0) { 
    color += (materialColor*dotFactor)/(1.0 + lightDistance*linearFactor + lightDistance*lightDistance*squareFactor); //apply dot factor and distance factors (in many cases the distance factors are 0) 
} 

vector shineVector = (sphereNormal*(2.0*dotFactor)) - fragmentToLight; //this is a vector that is mirrored through the normal, it is a reflection vector 
float shineFactor = dot(shineVector, normalize(cameraPosition-spherePosition)); //factor represents how strong is the light reflection towards the viewer 
if(shineFactor > .0) { 
    color += materialColor*(shineFactor*shineFactor * shine); //or some other power then 2 (shineFactor*shineFactor) 
} 

Этот шаблон для создания огней в фрагментном шейдере является одним из очень многих. Если вам это не нравится или вы не можете заставить его работать, я предлагаю вам найти еще один в Интернете, иначе я надеюсь, вы поймете это и сможете поиграть с ним.

+2

Точный шейдерный код, используемый для создания вышеуказанного изображения, можно найти здесь: http://stackoverflow.com/questions/10488086/drawing-a-sphere-in-opengl-es/10506172#10506172 (это было то, что я использовал для создайте образ, который был скопирован в вопрос здесь). –

Смежные вопросы