Koo叔说Shader-调试Shader

前言当写的Shader出现了一些不是预期的效果时,可能需要对Shader进行调试。但Shader不像其它语言能加断点debug,也不能打印输出。输出的只能是颜色值,所以可以将想要看的变量变换成颜色值,可视化的来查看问题,当然这需要一些小小的转换。顶点数据从哪里来一般对Shader调试,主要是调试顶点数据及变换,那么顶点数据是如何设置到Shader中的呢?在Unity中,是由Mesh...
摘要由CSDN通过智能技术生成

前言

当写的Shader出现了一些不是预期的效果时,可能需要对Shader进行调试。但Shader不像其它语言能加断点debug,也不能打印输出。输出的只能是颜色值,所以可以将想要看的变量变换成颜色值,可视化的来查看问题,当然这需要一些小小的转换。

顶点数据从哪里来

一般对Shader调试,主要是调试顶点数据及变换,那么顶点数据是如何设置到Shader中的呢?在Unity中,是由Mesh Renderer component对象每帧将mesh data发送到GPU中的(这个过程通常就叫做draw call)。每次draw call都会对性能有一定的开销,因此应当尽可能的在每次Draw call中传输大量Mesh.Mesh数据是由一组三角形(Triangle)列表数据组成,每个三角形有三个顶点(vertex),每个顶点存储着多个属性(attributes),如POSITION,NORMAL,TEXCOORD0,TEXCOORD1,TANGENT,COLOR等

内置顶点属性

通常将顶点属性组织到一个struct中。例如:

struct vertexInput{
    flaot4 vertex:POSITION;
    float4 tangent:TANGENT;
    float3 normal:NORMAL;
    float4 texcoord:TEXCOORD0;
    float4 texcoord1:TEXCOORD1;
    float4 texcoord2:TEXCOORD2;
    float4 texcoord3:TEXCOORD3;
    float4 color:COLOR;
}

这个结构在Shader中的用法如下:

Shader "Cg shader with all built-in vertex input parameters"{
    SubShader{
        Pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            struct vertexInput{
                flaot4 vertex:POSITION;
                float4 tangent:TANGENT;
                float3 normal:NORMAL;
                float4 texcoord:TEXCOORD0;
                float4 texcoord1:TEXCOORD1;
                float4 texcoord2:TEXCOORD2;
                float4 texcoord3:TEXCOORD3;
                float4 color:COLOR;
         
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值