2016-05-11 11 views
0

Я новичок в AGAL, ​​я уверен, что это не сложно.Ошибка Stage3D # 3632: связь AGAL: изменение в 1-м фрагменте шейдера, но не написано вершинным шейдером

У меня есть вершина и фрагмент шейдеры, для простого рисования коробки с текстурой без светового эффекта, вот код:

  vertexAssembly.assemble(Context3DProgramType.VERTEX, 
      "m44 op, va0, vc0\n" + // pos to clipspace 
      "mov v0, va1" // copy uv 
     ); 
     fragmentAssembly.assemble(Context3DProgramType.FRAGMENT, 
      "tex ft1, v0, fs0 <2d,linear,nomip>\n" + 
      "mov oc, ft1" 
     ); 

У меня также есть гал код для коробки без какой-либо текстуры, просто цвет и с световым эффектом, вот код для шейдеров:

 private const VERTEX_SHADER_LIGHT:String = 
     "mov vt0, va0\n"+ 
     "m44 op, vt0, vc0\n"+ 
     "nrm vt1.xyz, va0.xyz\n"+ 
     "mov vt1.w, va0.w\n"+ 
     "mov v1, vt1\n" + 
     "mov v2, va1" 

    private const FRAGMENT_SHADER_LIGHT:String = 
     "dp3 ft1, fc2, v1 \n"+ 
     "neg ft1, ft1 \n"+ 
     "max ft1, ft1, fc0 \n"+ 
     "mul ft2, fc4, ft1 \n"+ 
     "mul ft2, ft2, fc3 \n"+ 
     "add oc, ft2, fc1"; 

Вопрос в том, как я объединить 2 кода, я хочу, модель коробки с картой текстуры, чтобы показать с световым эффектом.

Я сделал это:

 private const VERTEX_SHADER_LIGHT:String = 
     "m44 op, va0, vc0\n" + // pos to clipspace 
     "mov v0, va1" // copy uv 
     //"mov vt0, va0\n"+ 
     //"m44 op, vt0, vc0\n"+ 
     "nrm vt1.xyz, va0.xyz\n"+ 
     "mov vt1.w, va0.w\n"+ 
     "mov v1, vt1\n" + 
     "mov v2, va1" 

    private const FRAGMENT_SHADER_LIGHT:String = 
     "tex ft1, v0, fs0 <2d,linear,nomip>\n" + 
     "mov oc, ft1 \n" + 
     "dp3 ft1, fc2, v1 \n"+ 
     "neg ft1, ft1 \n"+ 
     "max ft1, ft1, fc0 \n"+ 
     "mul ft2, fc4, ft1 \n"+ 
     "mul ft2, ft2, fc3 \n"+ 
     "add oc, ft2, fc1"; 

, но он дает мне ошибку: «Ошибка: Error # 3632: AGAL связь: Варьируя 1 считывается в пиксельный шейдер, но не записывается в вершинном шейдере. в flash.display3D :: Program3D/загрузки() в Context3DExample/setupScene() в Context3DExample/contextCreated()»

Я уверен, что кто-то с experiance может решить эту проблему в течение 5 минут. Благодаря

ответ

0

Похоже, вы забыли сцепить строки, т.е.

"mov v0, va1" // copy uv 
"nrm vt1.xyz, va0.xyz\n" 

должен быть

"mov v0, va1\n" + // copy uv 
"nrm vt1.xyz, va0.xyz\n" 

Примечание дополнительные \n и + на первой линии.

+0

Спасибо, теперь я не получаю сообщение об ошибке, и он работает, я вижу световой эффект, но я не получаю текстурную карту, так как цвет переписывает текстуру. Если я вынимаю часть кода и оставляю только первые 2 строки кода: \t «tex ft1, v0, fs0 <2d, linear, nomip> \ n" + \t \t \t "mov oc, ft1"; Я снова вижу текстуру, но светлый эффект исчез, что мне делать? –

+0

Я запрограммировал вспышку целую вечность, поэтому я не помню 100%. Попробуйте этот '' 'private const FRAGMENT_SHADER_LIGHT: String = " tex ft0, v0, fs0 <2d, linear, nomip> \ n "+ " dp3 ft1, fc2, v1 \ n "+ " neg ft1, ft1 \ n "+ " max ft1, ft1, fc0 \ n "+ " mul ft2, fc4, ft1 \ n "+ " mul ft2, ft2, fc3 \ n "+ " добавить ft3, ft2, fc1 \ n "+ «mul oc, ft0, ft3»; '' 'Но я вижу другие проблемы, например, нормаль должна быть перенормирована в пиксельном шейдере. – nikitablack

+0

Я использовал ваш код, но результат тот же, может быть, из-за проблемы нормалей?потому что, если я использую только 2 строки кода «tex ft1, v0, fs0 <2d, linear, nomip> \ n" + "mov oc, ft1"; Я вижу текстуру, я думаю, что нормали являются еще одной проблемой, они определяют, будет ли модель выглядеть гладко или нет. –

0

Найдено ответ здесь код (на основе nikitablack ответа сильфона):

 private const VERTEX_SHADER_LIGHT:String = "" + 

     "m44 op, va0, vc0\n" +// pos to clipspace 
     "mov v0, va1\n" +// pass uv 
     "mov v1, va0"; // pas normal for vertex shader. 


    private const FRAGMENT_SHADER_LIGHT:String = "" + 

    "tex ft0, v0, fs0 <2d,linear,nomip>\n" + // read from texture 
    "nrm ft1.xyz, v1.xyz\n" + // renormalize normal 
    "dp3 ft1, fc2.xyz, ft1.xyz \n" + // directional light contribution 
    //"neg ft1, ft1 \n" + // negation because we have a vector "from" light 
    "max ft1, ft1, fc0 \n"+ // clamp to [0, dot] 
    "mul ft1, ft1, fc3 \n"+ // contribution from light 
    "mul ft1, ft1, ft0 \n"+ // contribution from light + texture 
    //"add oc, ft1, fc1"; // final color as surface + ambient 
    "add oc, ft1, ft0"; // final color as surface + texture 

Я вынул «неги из ft1» нет необходимости отрицать это verctor в моем коде это нормально, как это , и я не добавил окружающий цвет в конце, просто текстуру еще раз, чтобы он стал ярким и понятным, с небольшим затенением.

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

  • Нет связанных вопросов^_^