Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 23 апр 2017, 21:40

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Урок 172. OpenGL. Perspective. Frustum. Ortho.
СообщениеДобавлено: 08 дек 2015, 10:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1323
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
В этом уроке:

- используем perspective-режим
- описываем frustum
- используем ortho-режим

Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 22 июн 2016, 21:03, всего редактировалось 12 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 10 дек 2015, 18:09 

Зарегистрирован: 25 янв 2015, 19:57
Сообщений: 34
Благодарил (а): 9 раз.
Поблагодарили: 2 раз.
damager82, спасибо огромное за Ваш труд! Если не трудно, подскажите, пожалуйста:
1)Почему размер массива mProjectionMatrix=16? Почему 16?
2)В уроке вы говорите, что z-буфер рисует тот треугольник видимым, который был нарисован позже. Почему тогда у нас зеленый спереди, а синий за ним? Ведь по коду у нас для одинаковых z синий после зеленого рисуется:
Код: [ Загрузить ] [ Скрыть ]
  1.    // зеленый треугольник 
  2.         glUniform4f(uColorLocation, 0.0f, 1.0f, 0.0f, 1.0f); 
  3.         glDrawArrays(GL_TRIANGLES, 0, 3); 
  4.         // синий треугольник 
  5.         glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f); 
  6.         glDrawArrays(GL_TRIANGLES, 3, 3); 

3) По поводу расчета ratio: данная формула справедлива, только когда у нас задается видимый объем в переделах от -1 до 1. Поэтому, я считаю, должна быть такая формула:
Код: [ Загрузить ] [ Скрыть ]
  1.     if (width > height) { 
  2.                 ratio = (float) width / height; 
  3.                 left = -ratio*Math.abs(left); 
  4.                 right = ratio*Math.abs(right); 
  5.             } else { 
  6.                 ratio = (float) height / width; 
  7.                 bottom =-ratio*Math.abs(bottom);; 
  8.                 top = ratio*Math.abs(top); 
  9.         } 

4) Мне кажется, что в этой строчке опечатка:
Код: [ Загрузить ] [ Скрыть ]
  1. // синий треугольник 
  2. ... 
  3. glDrawArrays(GL_TRIANGLES, 3, 6); 

Должно быть:
Код: [ Загрузить ] [ Скрыть ]
  1. // синий треугольник 
  2. ... 
  3. glDrawArrays(GL_TRIANGLES, 3, 3); 

-так как нам нужно брать с 3 элемента массива 3 координаты, а не 6.
P.S. УРААА!! Я наконец-то Вас догнал!! Я полтора года шел, шел, и наконец-то дошел до самого последнего урока!! Спасибо Вам за все!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 16 дек 2015, 00:23 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1323
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
1) Потому что матрица имеет размерность 4 на 4. А вот почему матрица имеет такую размерность, я уже не объясню. Это надо в геометрию углубляться.
2) В уроке я как раз пытался сказать, что z-bufer смотрит на "удаленность точки". И рисует ту, которая должна располагаться "ближе" к нам. А вот по умолчанию, без z-буфера, мы увидим на экране ту точку, которая была нарисована последней.
3) Верно, если больше единицы, то моя формула не сработает. Поправлю завтра.
4) Тоже верно, поправил.

Спасибо за замечания!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 20 дек 2015, 20:49 

Зарегистрирован: 25 янв 2015, 19:57
Сообщений: 34
Благодарил (а): 9 раз.
Поблагодарили: 2 раз.
damager82, да, я уже вспоминаю лекции по OpenGL в универе) Вот как выглядит матрица перспективного проецирования(glFrustum),нашел в лекциях:

Изображение


Вложения:
матрица.png
матрица.png [ 2.79 KiB | Просмотров: 5640 ]
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 20 дек 2015, 21:02 

Зарегистрирован: 25 янв 2015, 19:57
Сообщений: 34
Благодарил (а): 9 раз.
Поблагодарили: 2 раз.
damager82, на счет z-буфера. У нас треугольники рисуются с одинаковым z=1.0 - зеленый и синий. Мы в коде рисуем синий после зеленого. Если у нас одинаковый z, то по z-буферу мы должны увидеть тот, который был последним нарисован. Но я вижу наоборот-зеленый сверху, а должен быть синий. Почему так происходит?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 11 янв 2016, 20:39 

Зарегистрирован: 10 окт 2015, 18:07
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
danek130995 писал(а):
damager82, на счет z-буфера. У нас треугольники рисуются с одинаковым z=1.0 - зеленый и синий. Мы в коде рисуем синий после зеленого. Если у нас одинаковый z, то по z-буферу мы должны увидеть тот, который был последним нарисован. Но я вижу наоборот-зеленый сверху, а должен быть синий. Почему так происходит?

В данном случае просто когда рисуется вторая фигура происходит проверка на буфер глубины, видит что на этом уровне уже есть пиксель, и вторая фигура не рисуется в данном месте. т.е. еще раз как работает - если в буфере уже что-то записано, то пиксель не рисуется.
Поэтому с точки зрения производительности следует отрисовывать сначала ближние объекты - потом дальние (тогда получится что дальние фрагменты отбрасываются, а если делать наоборот от дальних к ближним , то будут обрабатываться все пиксели объекта рассчитываться, потом поверх них обсчитываться следующие пиксели, и т.д.)
А если бы у нас обе фигуры рисовались за один вызов draw, при одинаковом depth-buffer на самом деле может результат быть любой, вплоть до того что один пиксель с одной фигуры, а другой пиксель из другой, для этого специально смещают координату объектов на минимальную величину, например на 0.01f чтобы точно не было такой ситуации.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 13 янв 2016, 13:21 

Зарегистрирован: 25 янв 2015, 19:57
Сообщений: 34
Благодарил (а): 9 раз.
Поблагодарили: 2 раз.
Draz1w, спасибо Вам большое, теперь понял. Я просто не знал, что если на данном уровне уже пиксель есть нарисованный, т.е. в z - буфере уже что-то записано, то новый не будет рисоваться. Спасибо!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 14 янв 2016, 17:54 

Зарегистрирован: 14 янв 2016, 17:49
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Я не очень понимаю механизм работы. Мы создаем массив вершин и проекцию в самом начале, на этапе инициализации. Но разве это не должно делаться при отрисовке кадра, ведь в реальных задачах объекты перемещаются и наблюдатель тоже смотрит на происходящие в этом кадре слева в следующем справа.
Как насчет анимации?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 16 янв 2016, 15:09 

Зарегистрирован: 10 окт 2015, 18:07
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
АнтонФ писал(а):
Я не очень понимаю механизм работы. Мы создаем массив вершин и проекцию в самом начале, на этапе инициализации. Но разве это не должно делаться при отрисовке кадра, ведь в реальных задачах объекты перемещаются и наблюдатель тоже смотрит на происходящие в этом кадре слева в следующем справа.
Как насчет анимации?

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

Код: [ Загрузить ] [ Скрыть ]
  1.     uniform mat4 mvp; // model, view, projection matrix 
  2.         attribute vec4 aPosition; 
  3.          
  4.     void main() { 
  5.          
  6.         gl_Position = mvp * aPosition; 
  7.  


можно конечно пытаться изменять и сами вершины объектов, но это операция очень долгая в вычислениях ведь вершин у объекта может быть тысячи. Поэтому трансформируют матрицы.

Тема эта сложная сразу скажу, но без нее никак дальше двигаться не получиться
http://www.opengl-tutorial.org/beginner ... -matrices/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 19 янв 2016, 08:25 

Зарегистрирован: 14 янв 2016, 17:49
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Draz1w писал(а):
АнтонФ писал(а):
Т.е. никаких действий над объектами обычно не делают, а трансформируют специальные матрицы, а потом эту матрицу умножают на объект вот


Я с матрицами уже знаком (какую матрицу применить, чтобы повернуть налево, направо, сдвинуться...). Непонятно где и какими методами это все делать в методе "рендер". Я в свое время кодил под openGL 1.0 для ПК, так вот там было понятней. Сначала задаешь смещение всей сцены относительно глаза, потом для каждого объекта смещаешь систему координат, рисуешь, смещаешь обратно... и так пока всю сцену не отрисуешь. Тут я не вдуплю никак. Мы скормили OpenGL массив вершин в самом начале. А если объект не надо рисовать, допустим через 10 секунд он должен пропасть?
Я же правильно понимаю, что метод render это и есть тот самый "gameloop" в котором надо обсчитывать новое положение объектов в зависимости от времени и произошедших событий?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 19 янв 2016, 11:57 

Зарегистрирован: 10 окт 2015, 18:07
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
АнтонФ писал(а):
Я в свое время кодил под openGL 1.0 для ПК, так вот там было понятней. Сначала задаешь смещение всей сцены относительно глаза, потом для каждого объекта смещаешь систему координат, рисуешь, смещаешь обратно... и так пока всю сцену не отрисуешь. Тут я не вдуплю никак. Мы скормили OpenGL массив вершин в самом начале. А если объект не надо рисовать, допустим через 10 секунд он должен пропасть?
Я же правильно понимаю, что метод render это и есть тот самый "gameloop" в котором надо обсчитывать новое положение объектов в зависимости от времени и произошедших событий?

В GL20 немного не так, честно говоря в двух словах объяснить сложно, и у меня не хватит таланта но попробую :).
В GL20 не надо таскать всю сцену для отрисовки объектов туда сюда... обычно создают 3 матрицы, матрицу камеры (вида), матрицу проекции, и матрицы трансформаций для каждого объекта.
Матрицы - это просто массивы float[16].
Чтобы переместить объект например просто использую такую конструкцию:
android.opengl.Matrix.translateM(mObjectMatrix, 0, x, y, z);
все 3 матрицы передаются как uniform переменные в шейдер (либо все 3 матрицы объединяют в одну и куммулятивную и передают ее одну).
Код: [ Загрузить ] [ Скрыть ]
  1. attribute vec4 aPosition; 
  2.  
  3. uniform mat4 m,v,p, mvp; // model, view, projection and cummulative mvp matrix  
  4.  
  5.  
  6. void main() {     
  7.      
  8.     gl_Position = p*v*m * aPosition; 
  9.      
  10.     } 


либо так:
Код: [ Загрузить ] [ Скрыть ]
  1. attribute vec4 aPosition; 
  2.  
  3. uniform mat4 m,v,p, mvp; // model, view, projection and cummulative mvp matrix  
  4.  
  5.  
  6. void main() {     
  7.      
  8.     gl_Position = mvp * aPosition; 
  9.      
  10.     } 

чтобы переместить там камеру - просто изменяют матрицу камеры...
Нету такого чтобы как раньше чтобы нарисовать объект ты туда сюда таскаешь систему координат, за счет того что у тебя есть возможность использовать разные матрицы, ты работаешь с объектом в глобальных координатах, а не в локальных как раньше.

Причем я когда разбирался, я не нашел нигде внятного объяснения по матрицам увы, поэтому ссылку дать не могу...
разбирался чисто методом тыка проб и ошибок :(
причем первое время просто делал не понимая нормально как работает :)
и уже только когда добрался до освещения с normal и bump mapping тогда уже осознал как оно все работает :)))
Будем надеяться что на startandroid напишут нормальный мануал по матрицам :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 19 янв 2016, 14:24 

Зарегистрирован: 14 янв 2016, 17:49
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Draz1w писал(а):
В GL20 немного не так, честно говоря в двух словах объяснить сложно, и у меня не хватит таланта но попробую :).
В GL20 не надо таскать всю сцену для отрисовки объектов туда сюда... обычно создают 3 матрицы,


Правильно ли я понял, что для реализации анимации надо шейдер вершин более сложный написать? Типа в нем и будут координаты вершин умножаться на матрицы. Еще как разбить массив вершин на отдельные объекты, чтобы потом к ним разные матрицы применять? Короче у меня тумана в голове больше, чем ясности. Пыталя разобраться в DX 11, там та же идеология с шейдерами и тоже минимум материала дальше статических кубиков с текстурами.

Вот нигде не могу туториала найти, чтобы пример с анимацией был. Матрицы это так-то чисто математика. А вот где бы нормальный материал почитать по методам OpenGL ES, для реализации всего этого? Я пока не нашел, надеялся, что тут у Вас скоро появится следующий урок :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 19 янв 2016, 17:14 

Зарегистрирован: 10 окт 2015, 18:07
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
АнтонФ писал(а):
Правильно ли я понял, что для реализации анимации надо шейдер вершин более сложный написать? Типа в нем и будут координаты вершин умножаться на матрицы.

Да он простой блин а не сложный :)
просто тупо в шейдере умножаешь
Код: [ Загрузить ] [ Скрыть ]
  1. gl_Position = u_MVPMatrix  * a_Position; 
вот просто одна строчка в шейдере трансформирует все вершины с помощью матрицы :)
а вот вся сопутствующая лабуда вот тут...
http://www.learnopengles.com/android-le ... g-started/
с анимацией есть пример (если я не ошибся там вроде крутятся эти треугольнички)

вот тут есть примеры спрайтовой анимации
http://4pda.ru/forum/index.php?showtopic=418429


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 19 янв 2016, 17:18 

Зарегистрирован: 10 окт 2015, 18:07
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
АнтонФ писал(а):
Draz1w писал(а):
там та же идеология с шейдерами и тоже минимум материала дальше статических кубиков с текстурами.

Угу, я тоже столкнулся что на самом деле есть такой пробел.
Причем вон про матрицы и большие объекты пусто... типа как из 3d редактора построить модель в openGL.
А дальше опять появляется материал, типа там про свет, тени, отражение и прочее :)))
Я не знаю почему :)
Может кстати супер библию openGL почитать, там наверно должно быть, но у меня руки не дошли :)))
На рутрекере есть английская версия.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 19 янв 2016, 18:04 

Зарегистрирован: 14 янв 2016, 17:49
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Я пытаюсь вот это перевести на русский. Вроде доходчиво пишут
начало туториала
http://developer.android.com/intl/ru/tr ... nment.html
про анимацию
http://developer.android.com/intl/ru/tr ... otion.html

вроде, моя мысль про допил вершинного шейдера оказалась верна
это без анимации:
Код: [ Загрузить ] [ Скрыть ]
  1. ode]private final String vertexShaderCode = 
  2.         "attribute vec4 vPosition;" + 
  3.         "void main() {" + 
  4.         "  gl_Position = vPosition;" + 
  5.         "}"; 

это с анимацией:
Код: [ Загрузить ] [ Скрыть ]
  1. private final String vertexShaderCode = 
  2.         // This matrix member variable provides a hook to manipulate 
  3.         // the coordinates of the objects that use this vertex shader 
  4.         "uniform mat4 uMVPMatrix;" + 
  5.         "attribute vec4 vPosition;" + 
  6.         "void main() {" + 
  7.         // the matrix must be included as a modifier of gl_Position 
  8.         // Note that the uMVPMatrix factor *must be first* in order 
  9.         // for the matrix multiplication product to be correct. 
  10.         "  gl_Position = uMVPMatrix * vPosition;" + 
  11.         "}"; 


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 20 янв 2016, 14:46 

Зарегистрирован: 10 окт 2015, 18:07
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
АнтонФ писал(а):
Я пытаюсь вот это перевести на русский. Вроде доходчиво пишут
начало туториала

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

Код: [ Загрузить ] [ Скрыть ]
  1.     attribute vec4 aPosition; 
  2.     attribute vec2 aTextureCoord; 
  3.     attribute vec3 aNormal; 
  4.      
  5.     attribute vec3 aTangent; 
  6.     attribute vec3 aBinormal; 
  7.      
  8.     varying vec2 vTextureCoord;     
  9.     varying vec3 vViewDir; 
  10.     varying vec3 mPosition; 
  11.     varying mat3 vTangentMat; 
  12.      
  13.     uniform mat4 m,v, mvp; // model, view matrix 
  14.      
  15.     uniform mat3 uNormalMatrix; 
  16.      
  17.      
  18.     uniform vec2 uVec2TextureOffset; 
  19.      
  20.     void main() { 
  21.      
  22.         mPosition = vec3(v*m * aPosition);         
  23.          
  24.         vTextureCoord = aTextureCoord+uVec2TextureOffset;         
  25.              
  26.         gl_Position = mvp * aPosition; 
  27.          
  28.         vec3 norm = normalize(uNormalMatrix*aNormal); 
  29.         vec3 tang = normalize(uNormalMatrix*aTangent);  
  30.         vec3 bino = normalize(uNormalMatrix*aBinormal);     
  31.              
  32.         vTangentMat = mat3( 
  33.         tang.x, bino.x, norm.x, 
  34.         tang.y, bino.y, norm.y, 
  35.         tang.z, bino.z, norm.z ) ; 
  36.                  
  37.         vViewDir = vTangentMat * normalize(-mPosition); 
  38.          
  39.         } 
  40.  
  41. [FRAGMENT] 
  42.  
  43.     precision mediump float; 
  44.  
  45.     varying vec2 vTextureCoord; 
  46.     varying vec3 vViewDir; 
  47.     varying vec3 mPosition; 
  48.     varying mat3 vTangentMat; 
  49.      
  50.     uniform sampler2D uBaseMap; 
  51.     uniform sampler2D uNormalMap; 
  52.      
  53.     uniform vec3 uKa; //ambient 
  54.     uniform vec3 uKs; //specular 
  55.     uniform float uShininess; 
  56.     uniform vec3 uLightIntensity; // a,d,s ambient,diffuse,specular 
  57.      
  58.     uniform bool uDrawplane; 
  59.     uniform vec2 uTileSize; 
  60.     uniform vec2 uTileStart; 
  61.     uniform vec3 uLightPos; 
  62.      
  63.     vec3 phongModel( vec3 norm, vec3 diffR,vec3 vLightVector,float dist) { 
  64.         vec3 r = reflect( -vLightVector, norm ); 
  65.         vec3 ambient = uLightIntensity * uKa; 
  66.         float sDotN = max( dot(vLightVector, norm), 0.0 ); 
  67.         vec3 diffuse = uLightIntensity * diffR * sDotN; 
  68.      
  69.         vec3 spec = vec3(0.0); 
  70.         if( sDotN > 0.0 ) 
  71.             spec = uLightIntensity * uKs * 
  72.                    pow( max( dot(r,vViewDir), 0.0 ), uShininess ); 
  73.      
  74.         return (ambient + diffuse + spec)/(0.8+0.01*dist*dist*dist); 
  75.     } 
  76.      
  77.     void main() {         
  78.              vec3 vLightVector = normalize(vTangentMat*(uLightPos - mPosition)); 
  79.              float dist = length(uLightPos - mPosition); 
  80.             vec2 phase=vTextureCoord;; 
  81.             if (uDrawplane) {  
  82.                 phase=fract(vTextureCoord / uTileSize); 
  83.                 phase.x=phase.x*uTileSize.x+uTileStart.x; 
  84.                 phase.y=phase.y*uTileSize.y+uTileStart.y;              
  85.              }     
  86.             vec4 normal = 2.0 * texture2D( uNormalMap, phase ) - 1.0;                 
  87.             vec4 texColor = texture2D(uBaseMap,phase); 
  88.             gl_FragColor = vec4( phongModel(normal.xyz, texColor.rgb,vLightVector,dist), 1.0 ); 
  89.                                  
  90.     } 


освоишь уже можно будет очень много крутых вещей делать. очень крутая штука opengl и шейдеры.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 20 янв 2016, 19:50 

Зарегистрирован: 14 янв 2016, 17:49
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Draz1w писал(а):
Тут главное не сдаться и вот этот первоначальный такой затык пройти, врубиться как это все работает.
Я 4 раза бросал пытаясь разобраться с opengl :)
....ка opengl и шейдеры.


а можешь хоть в кратце своими словами объяснить такой момент:
в шейдере описываются некие переменные (attribute): одна матрица, две, числа какие-то...
как они в него передаются?
т.е. какие-то переменные, это те самые координаты вершин объекта, которые во времени не меняются, а какие-то - например позиция камеры или позиция объекта - меняются.
Как устанавливается связь между переменными в шейдере и переменными в JAVA?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 20 янв 2016, 21:52 

Зарегистрирован: 10 окт 2015, 18:07
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
attribute это входные массивы данных в вершинный шейдер.
т.е. это все вершины и все что с ними может быть связано.
причем если в шейдере несколько attribute,
например
attribute vec4 aPosition;
attribute vec2 aTextureCoord;
то если вершин будет 10, то и текстурных координат должно быть 10,
т.е. массивы в атрибутах должны быть всегда одинаковой длинны.

Сами данные по атрибутам передаются 2мя командами:
GLES20.glEnableVertexAttribArray(attributeHolderIndex)
GLES20.glVertexAttribPointer(attributeHolderIndex, сами данные сложенные в буфер)

Причем нужно понимать что сама шейдерная программа как бы будет работать для каждого атрибута из массива...
ну например передается 2 вершины: (1,0,0) и (1,1,1) - их передают в вершинный шейдер,
так вот программа вершинного шейдера выполниться 2 раза, один раз для первой вершины, второй раз для второй.
т.е. атрибуты каждый раз в каждом такте будут разными.

а uniformы - для каждого прохода шейдера будут одинаковыми...
т.е. униформы для всего отрисовываемого объекта будут одними, для всех вершин одни и теже значения.
передаются в шейдер они одной командой:
GLES20.glUniform1f(данные)...
в зависимости от типа команда будет незначительно отличаться:
GLES20.glUniform1f - предать 1 float
GLES20.glUniform1i - передать 1 int
GLES20.glUniform2f - передать 2 float
GLES20.glUniformMatrix4fv - передать матрицу 4*4

varying - это массивы данных которые передаются из вершинного шейдера во фрагментный.
(грубо можно их представить как тоже что и атрибуты, но если атрибуты из java в шейдер, то varying - это связь между шейдерами). varying в java никак не нужно описывать.
правда с varying есть еще одна штука, важная для понимания... если в вершинном шейдере varying на каждую вершину, то
во фрагментном уже будет varying для каждого пикселя.
Как это - например у нас есть 2 вершины пусть в вершине (a) var=1; а в вершине (b) var=2,
то во фрагментном шейдере мы увидим линейную интерполяцию для каждого пикселя который надо отрисовать.
т.е. для 11 пикселей - во фрагментном шейдере var={1 , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2 }
ну т.е. просто будет вот такое линейное размазывание (градиент) между значениями в вершинах.

кстати в новых версиях шейдеров
attribute переименовали в in
varying переименовали в out
если встретите in и out в примерах шейдеров не пугайтесь, для 2.0 просто переименовывайте и все будет работать.

вот как-то все так.
http://4pda.ru/forum/index.php?showtopi ... ry22114046


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 172. Perspective. Frustum. Ortho.
СообщениеДобавлено: 26 янв 2016, 08:44 

Зарегистрирован: 14 янв 2016, 17:49
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Спасибо огромное за пояснение. А ссылка вообще шикарной кладезью оказалась.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 4 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB