关于unityshader vertex阶段POSITION语义使用上的测试结果

里面有一句注释很让我吃鲸。

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广州-保安队长-自来水 ,没有他们我就不会写这篇博客,所以他们两个是这篇博客的助产士!


猜你喜欢

转载自blog.csdn.net/u012871784/article/details/80842637
今日推荐