1.3 Debugging of Shaders (调试着色器)

说实话这一章真没怎么看懂,不过先写出来吧,理解多少是多少,不对的地方欢迎大虾们批评指正。

本章主要讲述了如何对unity中的shander进行调试。其调试技术据说是个很久远的技术@_^这里举了一个如何生成假色图(false-color  images)的例子,通过改变片段着色器fragment   shader中color属性的输入参数值(即RGB某一基色的亮度)来得到着色器shader的输出数值。

上一章讲了如何将顶点着色器vertex  shader结构体中的输出参量作为片段着色器fragment   shader的输入参量,得到shader的过程。那么vertex  shader的数据是如何得到的呢?在unity中,游戏对象的网格渲染器Mesh   Renderer组件会通过OpenGL接口实时传回每一帧游戏对象的网格数据。这个过程我们通常称之为“draw   call”。这里传回的数据通常包含一个三角形列表,列表中定义了每个三角形3个顶点的属性和位置信息。顶点中的这些属性值就为vertex的输入参量。在unity中这些参量也叫做内嵌vertex输入参量。通常包括:位置信息position,曲面法线surface
  normal,2组纹理坐标texture   coordinates,切向量tangent   vector和顶点颜色vertex   color的名字、数据类型和语义。这些input  vertex   parameters属性是以独立的结构体呈现的。例如:

struct   vertexInput {

float4 vertex : POSITION; // position(in object coordinates,

// i.e. local or model coordinates)

float4 tangent : TANGENT;

// vector orthogonal to the surfacenormal

float3 normal : NORMAL; // surfacenormal vector (in object

// coordinates; usually normalizedto unit length)

float4 texcoord : TEXCOORD0;  // 0th set of texture

// coordinates (a.k.a. “UV”;between 0 and 1)

float4 texcoord1 : TEXCOORD1; // 1stset of texture

// coordinates  (a.k.a. “UV”; between 0 and 1)

fixed4 color : COLOR; // color (usuallyconstant)

};

这个结构体的使用方法如下:

Shader"Cg shader with all built-in vertex input parameters" {

SubShader {

Pass {

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

struct vertexInput {

float4 vertex : POSITION;

float4 tangent : TANGENT;

float3 normal : NORMAL;

float4 texcoord : TEXCOORD0;

float4 texcoord1 : TEXCOORD1;

fixed4 color : COLOR;

};

struct vertexOutput {

float4 pos : SV_POSITION;

float4 col : TEXCOORD0;

};

vertexOutput vert(vertexInput input)

{

vertexOutput output;

output.pos =  mul(UNITY_MATRIX_MVP, input.vertex);

output.col = input.texcoord; // setthe output color

// other possibilities to playwith:

// output.col = input.vertex;

// output.col = input.tangent;

// output.col =float4(input.normal, 1.0);

// output.col = input.texcoord;

// output.col = input.texcoord1;

// output.col = input.color;

return output;

}

float4 frag(vertexOutput input) : COLOR

{

return input.col;

}

ENDCG

}

}

}

在输入结构体预定义中,已经定义了appdata_base,appdata_tan, appdata_full三个常用类型,在文件UnityCG.cginc中保存。在使用过程中用include加载UnityCG.cginc文件即可使用。

structappdata_base {

float4 vertex : POSITION;

float3 normal : NORMAL;

float4 texcoord : TEXCOORD0;

};

struct appdata_tan {

float4 vertex : POSITION;

float4 tangent : TANGENT;

float3 normal : NORMAL;

float4 texcoord : TEXCOORD0;

};

struct appdata_full {

float4 vertex : POSITION;

float4 tangent : TANGENT;

float3 normal : NORMAL;

float4 texcoord : TEXCOORD0;

float4 texcoord1 : TEXCOORD1;

fixed4 color : COLOR;

// and additional texture coordinatesonly on XBOX360)

};

前面的程序可重写为:

Shader"Cg shader with all built-in vertex input parameters" {

SubShader {

Pass {

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

struct vertexOutput {

float4 pos : SV_POSITION;

float4 col : TEXCOORD0;

};

vertexOutput vert(appdata_full input)

{

vertexOutput output;

output.pos =  mul(UNITY_MATRIX_MVP, input.vertex);

output.col = input.texcoord;

return output;

}

float4 frag(vertexOutput input) :COLOR

{

return input.col;

}

ENDCG

}

}

}

如何演示假色图false-color  images呢?

如果将vertex输入参数使用纹理坐标(二维(x,y))texcoord的x轴取值来代表fragment color的红色组件值,则不论输出颜色是纯红色、黄色、洋红色所有情况取值red组件的值都是1,另外不论输出颜色是蓝色、绿色还是浅蓝色所有情况取值,此时的red组件的值都是0. 例如:

output.col= float4(input.texcoord.x, 0.0, 0.0, 1.0);

//float4(red,green,blue,alpha)此处透明度alpha的取值为1.0,在此处它的

//取值是不会对shader产生影响的.

这里设置red组件为纹理x轴坐标,设置绿色组件和蓝色组件都为0.此时的shader如图所示:

   

一个类似表面有经度的球。一个从0度到180度,由0(没有颜色——黑色)到1(纯红色)的渐变的球,而后又从180度到360度从新开始。

既然x坐标形成一个类似于经度的球,那么y坐标就会形成一个类似于纬度的球。此处因为纹理坐标取值范围为0到1,作用于坐标上0值为底部(南极),1为顶部(北极)。

output.col= float4(input.texcoord.y ,0.0, 0.0, 1.0);

生成地shader效果如图所示:

 
    

法向量normalized  vectors的取值范围是-1到+1之间。为让每一个color组件取值范围都在(0,1)之间,就将每一个组件都增加1,然后整体除以2,如下所示:

output.col= float4( (input.normal + float3(1.0, 1.0, 1.0)) / 2.0, 1.0);

 
 

这里法线向量是一个三维向量(x,y,z),它中黑色即没有颜色坐标轴取值为-1,亮度最大即各组件为纯RGB,坐标取值为+1.

output.col= float4(input.normal, 1.0);

    

调试练习

output.col = input.texcoord -float4(1.5, 2.3, 1.1, 0.0);

output.col = float4(input.texcoord.z);

output.col = input.texcoord / tan(0.0);

这几种情况都是黑色的shader即没有颜色,因为此时RGB三个组件的的值都为0。

下面的内容没怎么看懂,有兴趣的自己试着做做吧。  

The following lines require someknowledge about the dot and cross product:

output.col = dot(input.normal,float3(input.tangent)) *

input.texcoord;

output.col =dot(cross(input.normal, float3(input.tangent)),

input.normal) * input.texcoord;

output.col =float4(cross(input.normal, input.normal), 1.0);

output.col = float4(cross(input.normal,

float3(input.vertex)), 1.0);

// only for a sphere!

Does the function radians() alwaysreturn black? What‘s that good for?

output.col =radians(input.texcoord);

1.3 Debugging of Shaders (调试着色器),布布扣,bubuko.com

时间: 2024-10-12 03:33:49

1.3 Debugging of Shaders (调试着色器)的相关文章

第4章:缓冲区、着色器、GLSL

原文链接: http://www.rastertek.com/gl40tut04.html Tutorial 4: Buffers, Shaders, and GLSL This tutorial will be the introduction to writing vertex and pixel shaders in OpenGL 4.0. It will also be the introduction to using vertex and index buffers in OpenG

(转载)(官方)UE4--图像编程----着色器开发

着色器开发 快速入门 处理着色器时,请务必将 r.ShaderDevelopmentMode 设置为 1,以将其启用.最简单的方法是编辑 ConsoleVariables.ini,以便每次加载时都进行启用.这将启用"出错时重试"以及与着色器开发相关的日志和警告. 将更改保存到 .usf 文件之后,使用 Ctrl+Shift+. 可重新编译已更改的着色器. 如果您更改包括在许多着色器中的文件(例如,common.usf),那么此操作可能需要花费一些时间.如果您想对某个材质进行迭代,那么可

OpenGL ES着色器语言之着色概览(官方文档)

OpenGL ES着色器语言之着色概览(官方文档第二章) 事实上,OpenGL ES着色语言是两种紧密关联的语言.这些语言用来在OpenGL ES处理管线的可编程处理器创建着色器. 在本文档中,除非另外说明,一个语言功能适用于所有语言,并且通用用法将把他们当做一个语言来看待.特定语言将指出它们的目标处理器:顶点(vertext)或片元(fragment). 任何被着色器使用的OpenGL ES状态值都会自动地被跟踪并且作用于着色器上.这个自动状态跟踪机制允许应用程序为状态管理而使用OpenGL

Unity3D - 图形性能优化:优化着色器加载时间

Unity官方文档之"图形性能优化-优化着色器加载时间"的翻译,E文链接. Optimizing Shader Load Time 优化着色器加载时间 Shaders are small programs that execute on the GPU, and loading them can take some time. Each individual GPU program typically does not take much time to load, but shade

WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码

原文:WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码 HLSL,High Level Shader Language,高级着色器语言,是 Direct3D 着色器模型所必须的语言.WPF 支持 Direct3D 9,也支持使用 HLSL 来编写着色器.你可以使用任何一款编辑器来编写 HLSL,但 Shazzam Shader Editor 则是专门为 WPF 实现像素着色器而设计的一款编辑器,使用它来编写像素着色器,可以省去像素着色器接入

顶点着色器详解 (Vertex Shaders)

学习了顶点处理,你就知道固定功能流水线怎么将顶点从模型空间坐标系统转化到屏幕空间坐标系统.虽然固定功能流水线也可以通过设置渲染状态和参数来改变最终输出的结果,但是它的整体功能还是受限.当我们想实现一个外来的光照模型,外来的Fog或者点大小计算方式,等等,我们可能就放弃使用固定功能流水线,转而使用CPU来实现这些计算. 使用vertex shaders,它用一段小程序替换固定功能处理.这段小程序的输入是模型空间的顶点,输出齐次剪裁空间的顶点,并且还携带一些信息,如:per-vertex diffu

【Unity Shaders】Lighting Models —— 衣服着色器

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 布料(Cloth)是另一种非常常见的着色需求,在很多实时游戏中都需要它来实现更真实的交互体

BGFX 渲染引擎中着色器代码的调试方法

在实时渲染的图形开发中,着色器代码(Shader)越来越复杂,于是单纯的靠经验和不断试错的开发和调试方法早已不能满足实际需求.使用调试工具进行调试,成为开发中重要的方法.Bgfx 是一款跨平台.抽象封装了众多主流图形 API 的优秀渲染引擎.作为示例,本文在 Windows 平台上演示使用 Microsoft Visual Studio* 和 RenderDoc 对 Bgfx 中的 DX11 着色器代码进行调试.了解详情 原文地址:https://www.cnblogs.com/IDZPRC/p

Unity Shaders and Effects Cookbook (6-1) 使用 alpha 参数的 半透明着色器

对于游戏项目,透明是很消耗资源的一个操作,在Unity的Profile 中可以很直观的看到透明所消耗的系统资源. 在Unity的表面着色器 Surface Shader 中,我们可以很方便的创建一种全透明的效果.如草的表面.这一节学习 通过在 #pragma 语句中添加 alpha 参数 来使用透明功能. 这一节我使用了下面这张贴图作为球 的表面纹理. 这张 512x 512 的图片分为了 4个色块区域.分别是 Green .Red.White.Blue. Green:就是 G通道为1,R.B