里面有一句注释很让我吃鲸。
o.dummy = v.vertex;
// make OpenGL happy
然后,这里做一点笔记。
下面这个是测试shader1
Shader "ShaderStore/Templates/Test Vertex POSITION"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
float4 vertpos = float4(0,0,0,1);
o.vertex = mul(UNITY_MATRIX_P, mul(UNITY_MATRIX_MV, vertpos) + float4(v.uv.x-0.5, v.uv.y-0.5, 0.0, 0.0));
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(1,0,0,1);
}
ENDCG
}
}
}
单纯从这个shader上看,如果我使用unity自带的Quad物体的话,理论上是符合dynaminc bacthing的。呵呵,理论上这三个字已经暴露我接下来的话了。。mmp
上测试图
没有动批。。。是的,你没有看错,没有动屁。。。framedebug也没有告诉原因。
如果在shader中指做一点点事情。
struct
v2f
{
float4
vertex
: SV_POSITION
;
float4
tmp
: TEXCOORD0
;
};
v2f
vert
(appdata v)
{
v2f o;
float4
vertpos =
float4
(
0
,
0
,
0
,
1
);
o.vertex =
mul
(
UNITY_MATRIX_P
,
mul
(
UNITY_MATRIX_MV
, vertpos) +
float4
(v.uv.x-
0.5
, v.uv.y-
0.5
,
0.0
,
0.0
));
o.tmp = v.vertex;// make OpenGL happy
return
o;
}
是的,fragment不需要修改什么。这次修改的意思就是在vert的输出结构里使用POSITION语义的变量就可以了
我是在没有忍住,还是加个了注释// make OpenGL happy。But why? I don't know...
然后,测试结果
是的game视窗下的公告板看似少了一个,其实并没有,只是两个重合了而已。
这个问题就是广州-保安队长-自来水提出来的问题。
然后抛出这个问题。的确目前不知道如何解决。下图是保安队长的测试:
大家手里估计都有可以动态批处理的公告板shader,如何产生了动批之后,每一个公告板自身transform的rotation确生效了。。。这就违背了公告板本身的设计意图。
How?
最后还得感谢北京-程序-may和广州-保安队长-自来水 ,没有他们我就不会写这篇博客,所以他们两个是这篇博客的助产士!