2016-05-11 2 views
0

Мне был предоставлен код шейдеров (вершина и фрагмент), и моя цель - добавить некоторые функции. Но мне трудно понять некоторые функции и математику внутри. У меня есть изображение, которое я хочу проецировать текстуру этого изображения на цилиндр. Это, как я получаю пиксели от текстуры:функция для вычисления матрицы ортогональной проекции

float hFOV=0.0789;  // orizontal field of view 
float aspectRatio=1.5; 
float ax = tan(hFOV * M_PI); 
float ay = ax/aspectRatio; 
vec4 q1 = myW2N(ax,ay,1.,6.) * vec4(d, 1.); // ??  
vec2 p = q1.xy/q1.w; 
p = 0.5 * (p + 1.0); 
vec4 c = texture2D(foto, p); 

Но что делает меня головную болью является myW2N() функцией, я не могу пройти через идею внутри и что результат означает. Это просто мое мнение, что это создает матрицу проекции .. Для того, чтобы показать вам тело этой функции:

mat4 myW2N(float ax, float ay, float zNear, float zFar) { 
    float cx = 1.0/ax; 
    float cy = 1.0/ay; 
    float z0 = -zNear; 
    float z1 = -zFar; 
    float az = (z0 + z1)/(z0 - z1); 
    float bz = (1. - az) * z0; 
    return mat4(
     cx, 0., 0., 0., 
     0., cy, 0., 0., 
     0., 0., az, bz, 
     0., 0., -1., 0. 
     ); 
    } 

Может кто-нибудь сказать мне, что zNeat and zFar представляют там? Я пытался поставить там несколько значений и меняет форму wraped изображения, но что странно это как-то работает, даже если zNear больше что zFar ..

Не могли бы вы дать мне ключ, что означает, что эта функция и что она делает в конец, пожалуйста?

+0

«* У меня есть образ, который я хочу, чтобы обернуть вокруг цилиндра так, я говорю о ортогональной проекции. * «Хм, что? Вы пытаетесь проецировать текстуру на цилиндр? Кроме того, вы используете настольные OpenGL, OpenGL ES или WebGL? Потому что они не все одинаковые. –

+0

Хорошо, извините. Да, я хочу проецировать текстуру на цилиндр. И я использую webGL, но я думал, что флеш-шейдеры работают одинаково везде ...? –

+0

@NicolBolas и кстати. разве вы не представляете, что это может быть? Я имею в виду функцию, о которой идет речь. –

ответ

2

You might want to read up on how matrices work, но если вы будете следовать столбцы

первый столбец будет умножать X на 1/ax что означает, что это будет масштабироваться от +/-ax единиц по всему в усеченном пространстве +/-1.

Вторая колонка будет делать то же самое для масштабирования Y от +/-ay до места для клипа.

3-я колонка и 4-я колонка эффективно делают область zNear до zFar в пространстве Z (перед камерой), когда вещи делятся на w. Поскольку в 4-м столбце используется Z (3-я строка вниз), это перспективная матрица, а не орфографическая матрица.

d затем умножается на эту матрицу. Следующая строка vec2 p = q1.xy/q1.w; фактически делает p координатой перспективы пространства 2d. Линия после p = 0.5 * (p + 1.0) переходит из клипа пространства 2d в пространство текстуры 2d

Там нет кода в вашем фрагменте, связанного с цилиндрами

+0

Первое спасибо за ответ. Итак, как вы сказали, это перспективная матрица. Означает ли это, что эта матрица определяет положение камеры, а сцена, на которую смотрит камера, является перспективной? –

+0

[Матрица проецирования] (http://webglfundamentals.org/webgl/lessons/webgl-3d-perspective.html) преобразует пространство некоторого 'frustum' (например, куба с одной стороной меньше противоположной стороны) на 2 единицы куба, который идет от +1 до -1 в каждом измерении. [Матрица камеры (или матрица просмотра)] (http://webglfundamentals.org/webgl/lessons/webgl-3d-camera.html) - это то, что определяет положение и ориентацию камеры. Поскольку у вас нет матрицы камеры, ваша камера находится в начале координат, глядя вниз на ось -Z. – gman

+0

Удивительно, спасибо еще раз! –

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