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