【发布时间】:2016-05-11 15:04:41
【问题描述】:
我是 AGAL 的初学者,我相信这并不复杂。
我有一个顶点和片段着色器,用于简单地绘制一个没有光效的带有纹理的盒子,代码如下:
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"
);
我还有一个没有纹理、只有颜色和灯光效果的盒子的 AGAL 代码,这里是着色器的代码:
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";
问题是,如何结合这两个代码,我想要一个带有纹理贴图的盒子模型,以显示灯光效果。
我这样做了:
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";
但它给了我一个错误: “错误:错误 #3632:AGAL 链接:可变 1 在片段着色器中被读取,但未被顶点着色器写入。 在 flash.display3D::Program3D/upload() 在 Context3DExample/setupScene() 在 Context3DExample/contextCreated()"
我相信有经验的人可以在 5 分钟内解决这个问题。 谢谢
【问题讨论】:
标签: stage3d