параметры шейдера cg - PullRequest
       40

параметры шейдера cg

0 голосов
/ 06 марта 2012

Я пытаюсь написать шейдер с использованием cg (для ogre3d).Кажется, я не могу разобрать работающий шейдер, который хотел бы использовать в качестве отправной точки для своего собственного кода.

Вот декларация для шейдера:

void main
(
  float2 iTexCoord0 : TEXCOORD0,

  out float4 oColor : COLOR,

  uniform sampler2D covMap1,
  uniform sampler2D covMap2,
  uniform sampler2D splat1,
  uniform sampler2D splat2,
  uniform sampler2D splat3,
  uniform sampler2D splat4,
  uniform sampler2D splat5,
  uniform sampler2D splat6,

  uniform float splatScaleX,
  uniform float splatScaleZ
) 
{...}

Мои вопросы:

iTexCoord0, очевидно, является входным параметром.Почему он не объявлен как равномерный?

(oColor, очевидно, является выходным параметром. Без вопросов)

covMap1 - splat6 - текстуры.Эти параметры или что-то загружено в память видеокарты (например, глобальные)?Определение огров для шейдерной программы не перечисляет их в качестве параметров.

Являются ли splatScaleX и splatScaleZ параметрами?Определение ogre для шейдерной программы также не перечисляет их как параметры.

Означает ли порядок объявления что-либо при отправке значений из внешней программы?

Я хотел бы передатьмассив поплавков (карта высот).Я предполагаю, что это будет

  uniform float splatScaleZ,
  uniform float heightmap[1024]
) 
{...}

Если я не передам один из параметров, шейдер просто не будет выполнен (и мой объект будет невидимым, потому что у него нет текстуры)?

Есть ли лучший способ отладить их, чем просто ударить / пропустить и угадать?

1 Ответ

3 голосов
/ 06 марта 2012

iTexCoord0, очевидно, является входным параметром. Почему не объявлена ​​униформа?

Униформа - это не то же самое, что входные параметры. iTexCoord - это переменный вход, то есть для каждой вершины он может иметь уникальное значение. Это устанавливается с помощью команд, таких как glVertexAttribPointer. Такие вещи, как координаты вершин, нормали, текстовые координаты, цвета вершин, являются примерами того, для чего вы можете использовать различные входные данные.

Униформы, с другой стороны, предназначены быть статическими для всего вызова отрисовки или, возможно, для всего кадра или жизни программы. Они устанавливаются с помощью команд glUniform *. Униформа может быть чем-то вроде матрицы вида модели для объекта или положения солнца для расчета освещения. Они меняются не очень часто.

[править] Эти конкретные команды, я думаю, на самом деле работают с GLSL, но теория должна быть такой же для CG. Найдите специальный учебник по cg, чтобы выяснить точные команды для установки вариантов и униформы.

covMap1 - splat6 - текстуры. Эти параметры или что-то загружено в память видеокарты (например, глобальные)? Определение огров для шейдерной программы не перечисляет их в качестве параметров.

Мой CG немного ржавый, но если он такой же, как GLSL, то sampler2d является униформой, которая берет индекс, который представляет, из какого сэмплера вы хотите сэмплировать. Когда вы делаете что-то вроде glActiveTexture (GL_TEXTURE3), glBindTexture (n), тогда вы устанавливаете форму сэмплера на «3», которую вы можете сэмплировать из этой текстуры.

Значит ли порядок объявления что-либо при отправке значений из внешней программы?

Нет, переменные упоминаются во внешней программе по именам строковых переменных.

Если я не передам один из параметров, шейдер просто не будет выполнен (и мой объект будет невидимым, потому что у него нет текстуры)?

Неизвестно. Вероятно, они будут иметь «некоторое» начальное значение, хотя трудно ли предположить, имеет ли это какой-либо смысл и будет ли что-то генерироваться.

Есть ли лучший способ отладить их, чем просто ударить / пропустить и угадать?

http://http.developer.nvidia.com/CgTutorial/cg_tutorial_appendix_b.html Смотрите раздел B.3.8

...