2015-06-30 6 views
0

У меня есть самолет со следующими шейдеры:Shader игнорирование позиции переменной

<script type="x-shader/x-vertex" id="vertexshader"> 

    varying vec3 col; 

    void main() 
    { 
     col   = vec3(position.z, position.z, 1); 
     gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 
    } 

</script> 

<script type="x-shader/x-fragment" id="fragmentshader"> 

    varying vec3 col; 

    void main() 
    { 
     // set color for the current vertex 
     gl_FragColor = vec4(col, 1); 
    } 

</script> 

Я переезжаю самолет в сторону от камеры, как это:

function renderFrame() 
{ 
    cube.position.z -= 1; 
    requestAnimationFrame(renderFrame); 
    renderer.render(scene, camera); 
}; 

Проблема заключается в том, что я бы предположить, поскольку куб движется, значение позиции шейдеров фрагмента будет меняться, но это не так. Разве переменная 'position' не передает текущее местоположение объектов в 3D пространстве? Если нет, как я могу определить его местоположение и поворот, или мне придется передавать эту информацию вручную в шейдер, используя единую переменную?

Рабочий пример: http://webgl.demised.net/experiments/003_Shaders.php

Кроме того, не шейдеры выполнить один раз при инициализации или на каждом кадре?

ответ

2

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

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

Шейдеры выполняются много раз. Каждая полученная вершина вызывает вызов вершинного шейдера. Каждый заполненный фрагмент вызывает вызов фрагментарного шейдера. Это происходит каждый раз, когда изображение отображается (т. Е. Каждый кадр).

+0

Большое спасибо за объяснение! – user3578847