代码编织梦想

今天在看Unity Shader入门精要这本书,照着书上打代码练习的时候出现了invalid output semantic 'SV_POSITION’这个报错。本文为这个报错的解决方法。
在这里插入图片描述

Shader "shaderStudy/SimpleShader"
{
    Properties
    {
        //声明一个Color类型的属性
        _Color ("Color Tint", Color) = (1.0, 1.0, 1.0, 1.0)
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            //告诉unity哪个函数包含了顶点着色器代码,哪个包含了偏远着色器的代码
            #pragma vertex vert
            #pragma fragment frag

            //在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量
            fixed4 _Color;

            //a:application应用,2:to,v:vertex shader顶点着色器
            struct a2v
            {
                //POSITION语义告诉unity,用模型空间的顶点坐标填充vertex变量
                float4 vertex : POSITION;
                //NORMAL语句告诉unity,用模型空间下的法线方向填充normal变量
                float3 normal : NORMAL;
                //TEXCOORD0语义告诉unity,用模型的第一套纹理坐标填充texcoord变量
                float4 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                //SV_POSITION语义告诉unity,pos里面包含了顶点在裁剪空间中的位置信息
                float4 pos : SV_POSITION;
                //COLOR0语义可以用于储存颜色信息
                fixed3 color : COLOR0;
            };

            v2f vert(a2v v) : SV_POSITION
            {
                //声明输出结构
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                //v.normal包含了顶点的法线方向,其分量范围在[-1.0, 1.0]
                //下面的代码吧分量范围映射到了[0.0, 1.0]
                //储存到o.color中传递给片元着色器
                o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target{
                fixed3 c = i.color;
                //使用——Color属性来控制输出颜色
                c *= _Color.rgb;

                //将插值后的i.color显示到屏幕上
                return fixed4(c, 1.0);
            }
            ENDCG
        }
    }
}

这是出错代码

在这里插入图片描述

当时检查了很多遍,代码和书上的都一样,第一次感受到了大家说的学Shader从入门到放弃。
后来在看了CSDN上的几篇帖子后了解到了问题所在。书中的Unity5.3.6版本中,这是没有错的,但在后续的5.4的版本里,顶点着色器输出的时候不需要再单独对整个顶点的输出位置进行指定了。
其实就是直接把“:SV_POSITION”删了就行。
修改后的代码:

            v2f vert(a2v v)
            {
                //声明输出结构
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                //v.normal包含了顶点的法线方向,其分量范围在[-1.0, 1.0]
                //下面的代码吧分量范围映射到了[0.0, 1.0]
                //储存到o.color中传递给片元着色器
                o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
                return o;
            }

在Unity中也正常了。
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50617270/article/details/129975513

unreal engine 4.8 release notes-爱代码爱编程

Release Notes On this page: Major FeaturesRelease NotesProgramming Release NotesUpgrade Notes This release includes 189 great changes that

unity shader踩坑笔记-1 invalid output semantic 'sv_position'的问题_evanbear的博客-爱代码爱编程

      学了一段时间unity(2018.1),自己做了几个小demo后,考虑着学一下shader,没有任何CG/HLSL的基础,所以真可谓是UnityShader学习从入门到放弃。。。。        于是本着踩到一个坑记录一个坑的原则,准备整理点东西。        刚开始学shader的头几个知识点中我们肯定会学到一个简单的顶点片元着色器的写法:

学习unity shader问题记录_猫叔大鸭梨的博客-爱代码爱编程

 invalid output semantic 'SV_POSITION': Legal indices are in [0,0] at line 25 (on d3d11) 《unity shader 入门精要》中,有一段实例代码 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'Uni

unity shader入门精要之invalid output semantic 'SV_POSITION'-爱代码爱编程

Shader "Unlit/Test-5.1" {     Properties     {         //声明一个Color类型的属性         _Color("Color Tint",Color)=(1.0,1.0,1.0,1.0)     }     SubShader     {         pass         {      

unity shader入门精要学习踩坑记录-爱代码爱编程

v2f vert(a2v v):SV_POSITION { v2f o; o.pos=UnityObjectToClipPos(v.vertex); o.color=v.normal * 0.5 + fixed3(0.5,

Shader入门精要第五章坑之invalid output semantic ‘SV_POSITION‘-爱代码爱编程

Shader “Unity Shaders Book/Chapter 5/5-1” { Properties{ //主要用于声明一些属性,可以没有 _Color(“Color Tint”,Color)=(1.0,1.0,1.0,1.0) //声明了一个可以编辑的颜色属性 } SubShader { Pass { CGPROGRAM #pragma vert

Shader入门精要 学习采坑日志-爱代码爱编程

初学Shader,非常难啃,写下日志记录学习 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Unlit/LearnPath1" { SubShader { Pass {

次世代培训——我们从游戏美术发展历程讲起-爱代码爱编程

自90后们记忆最初的小霸王游戏算起,中国游戏大致经历了从像素时代-预渲染时代-初世代-中世代-次世代这样几个阶段的变革。有趣的是,当主机、PC游戏早已跨过了像素时代,手游的兴起和发展却依然要遵从这一发展规律从头开始,当人们已

第二十六章 着色器总结-爱代码爱编程

OpenGL 写着色器有着色器语言叫做GLSL。是类c语言,开头需要声明版本,声明输入和输出变量,如果有需要声明uniform变量,最后声明main函数。 顶点着色器中的输入变量,叫做顶点属性,且能

unity shader入门精要学习笔记 -爱代码爱编程

转载自 冯乐乐 《Unity Shader 入门精要》 一个顶点/片元 着色器的结构大概如下:   Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubShader Pass { //设置渲染状态和标签 //开始CG代码片段

【技术美术图形部分】pbr全局光照:理论知识补充_全局光照 间接光照-爱代码爱编程

写在前面 最近做东西的流程是这样的,想实现一个风格化森林小场景,场景体现的主体是风格化树和交互草 --> 于是用了两天时间学SpeedTree做树模型 --> 用了两天时间SD做了树干贴图 --> SD做的贴图是根据PBR Metal-Roughness(金属度/粗糙度)工作流整理的: 突然发现PBR这块儿还有空缺:学了TA快一年

pipeline渲染管线和texture mapping纹理映射_shader pipelines-爱代码爱编程

Graphics Pipeline渲染管线 输入空间中的点投影到屏幕形成三角形光栅化(包含深度缓存)着色输出 shader shader在上图中可操作的部分是Vertex Processing和Fragment Pro

[计算机图形学]可见性与遮挡,z-爱代码爱编程

一、前言 通过光栅化我们知道,模型的三角形最终都被画在了屏幕上成为了像素,那么真实的场景往往有许多模型,也就是有很多三角形需要被画在屏幕上,这么多的三角形如何正确的判断它们的遮挡关系,从而把离我们摄像机最近的三角形画出来是一个问题,而解决这个问题的方法就是我们今天要讲的Z-Buffer,中文名深度缓存/缓冲。 二、画家算法 场景中有很多的