一、顶一个简单的shader
shader代码:
Shader "Custom/surface_shader_custom" {
SubShader {
//surface shader是对顶点和片段的封装,所以不需要pass通道,但是片段着色器必须有pass通道
//在CGPROGRAM与ENDCG之间可以嵌入CG代码断
pass{
CGPROGRAM
//vertex后面可以指定顶点的函数名
//要求顶点和片段程序都必须要编写,否则缺一个就不能得到正确的运行
#pragma vertex vert
#pragma fragment frag
//顶点程序必须对数据进行处理,并输出
//顶点程序,冒号后面需要加语义
void vert(in float2 objPos:POSITION,out float4:POSITION){
pos= float4(objPos,0,1)
}
//片段程序拿到顶点程序中的输入结果,然后再进行最终结果的计算
void frag(){
col=float4(1,0,0,1)
}
ENDCG
}
}
FallBack "Diffuse"
}
添加一个球体,一个材质material,添加一个shader,将shader添加到材质上,并将材质赋给球体
二、在顶点程序中进行输出
Shader "Custom/surface_shader_custom" {
SubShader {
//surface shader是对顶点和片段的封装,所以不需要pass通道,但是片段着色器必须有pass通道
//在CGPROGRAM与ENDCG之间可以嵌入CG代码断
pass{
CGPROGRAM
//vertex后面可以指定顶点的函数名
//要求顶点和片段程序都必须要编写,否则缺一个就不能得到正确的运行
#pragma vertex vert
#pragma fragment frag
//顶点程序必须对数据进行处理,并输出
//顶点程序,冒号后面需要加语义
void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR){
pos= float4(objPos,0,1);
//赋值,给蓝色
col=float4(0,0,1,1);
}
//片段程序拿到顶点程序中的输入结果,然后再进行最终结果的计算
//inout的意思是既是从顶点程序中输入进来的,也会进行输出
void frag(inout float4 col:COLOR){
//col=float4(1,0,0,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
赋的是蓝色的值,不知道为什么会是黑色,不管在输入的地方颜色改成什么都显示是黑色
三、在片段程序中将颜色改为绿色
Shader "Custom/surface_shader_custom" {
SubShader {
//surface shader是对顶点和片段的封装,所以不需要pass通道,但是片段着色器必须有pass通道
//在CGPROGRAM与ENDCG之间可以嵌入CG代码断
pass{
CGPROGRAM
//vertex后面可以指定顶点的函数名
//要求顶点和片段程序都必须要编写,否则缺一个就不能得到正确的运行
#pragma vertex vert
#pragma fragment frag
//顶点程序必须对数据进行处理,并输出
//顶点程序,冒号后面需要加语义
void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR){
pos= float4(objPos,0,1);
//赋值,给蓝色
col=float4(0,0,1,1);
}
//片段程序拿到顶点程序中的输入结果,然后再进行最终结果的计算
//inout的意思是既是从顶点程序中输入进来的,也会进行输出
void frag(inout float4 col:COLOR){
//在片段程序中将颜色改为绿色
col=float4(1,0,0,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
在片段程序中将颜色改为了绿色,但是不知道为什么球体的颜色是红色,不管输出改成什么颜色都是显示成红色
四、坐标
计算机的图形硬件,想要对3d场景中的物体进行正确的显示的时候,需要经过一系列坐标系的变换。比如说,输入的是一个物体的坐标系,那么物体的坐标系是没有参考价值的,最终要放到世界坐标系中,与其它物体有一个相对位置,同时还被摄像机进行照射,摆在不同的位置,摄像机最终取景的位置不一样,通过这一系统的变化,会有一个被称作c v v的裁剪立方体,c v v实际上就是我们在进行摄像机透视投影在其次空间当中的一个裁剪立方体,它的值总是取决于x从-1到+1,y也是-1到+1。对于默认创建的一个cube,unity在这个cube当中的网格数据的顶点信息当中存储的最大的x是0.5,最小的x是-0.5,最大的y是0.5,最小的y是-0.5,而模型的中心处于(0,0)位置。