gpt4 book ai didi

opengl - 使用自定义着色器调用 Material.setPass 会破坏 GL - Unity

转载 作者:行者123 更新时间:2023-12-02 05:37:59 28 4
gpt4 key购买 nike

这是我的着色器,它将一种颜色替换为另一种颜色:

Shader "Custom/SwapColors" 
{
Properties
{
_MainTex("Texture",2D)="white"{}
swap_from("Swap From",COLOR)=(1,1,1,1)
swap_to("Swap To",COLOR)=(1,1,1,1)
threshold("Threshold",Float)=0.00001
}
SubShader
{
Tags
{
"Queue"="Transparent"
}
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

sampler2D _MainTex;
float4 swap_from;
float4 swap_to;
float threshold;

struct VertexInput
{
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
struct FragmentInput
{
float4 pos:SV_POSITION;
float2 uv:TEXCOORD0;
};

FragmentInput vert(VertexInput data)
{
FragmentInput res;
res.pos=mul(UNITY_MATRIX_MVP,data.pos);
res.uv=data.uv;
return res;
}
bool eq(fixed f,fixed s)
{
return abs(f-s)<threshold;
}
float4 frag(FragmentInput data):COLOR
{
float4 res=tex2D(_MainTex,data.uv.xy).rgba;
if(eq(res.r,swap_from.r)&&eq(res.g,swap_from.g)&&eq(res.b,swap_from.b))
res.rgb=swap_to.rgb;
return res;
}
ENDCG
}
}
Fallback "Diffuse"
}

这是附加到包含主摄像头的游戏对象的测试脚本。在其中我尝试渲染一条线和一个带纹理的四边形。

mat 分配有带有纹理的 SwapColors

sprite_mat 分配有具有相同纹理的默认 Sprite 着色器。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
[SerializeField]
Material mat;
[SerializeField]
Material sprite_mat;
void OnPostRender()
{


GL.PushMatrix();
GL.LoadProjectionMatrix(Camera.main.projectionMatrix);
GL.modelview=Camera.main.worldToCameraMatrix;

GL.Begin(GL.LINES);
sprite_mat.SetPass(0);
GL.Vertex(new Vector3(0,0));
GL.Vertex(new Vector3(5,0));
GL.End();


GL.Begin(GL.QUADS);
sprite_mat.SetPass(0);

mat.SetPass(0);//<------------------------------------ PROBLEM

GL.TexCoord(new Vector3(0,0));
GL.Vertex(new Vector2(0,0));

GL.TexCoord(new Vector3(1,0));
GL.Vertex(new Vector2(1,0));

GL.TexCoord(new Vector3(1,1));
GL.Vertex(new Vector2(1,1));

GL.TexCoord(new Vector3(0,1));
GL.Vertex(new Vector2(0,1));
GL.End();


GL.PopMatrix();
}
}

当我使用 sprite_mat 渲染四边形时,一切正常。

当我使用 mat 时,不仅四边形消失了,连线条也消失了,尽管它是用 sprite_mat 渲染的。

如果我在编辑器中创建另一个四边形并将其 Material 设置为 mat,它就会正确渲染。

我的主要问题是 setPass 如何影响在另一个不相关的 setPass 之后渲染的几何图形。

示例项目:forum.unity3d.com/attachments/errorgl-7z.138105/

<小时/>

编辑:我找到了一个默认的 Unity sprite 着色器,并将其与我的进行比较。四边形消失了,因为它面向与相机相反的方向。它已通过Cull Off修复。

如果我添加一行

float4 颜色:COLOR;

VertexInput 结构,使用我的着色器的 Material 不再影响使用其他 Material 的几何体。我不明白发生了什么事。

最佳答案

我认为你不能 SetPass(0) GL.Begin(..)之间两次和GL.End(..) .

您可以使用 SetPass(0); [..] SetPass(1); 设置各种通行证但看看你的着色器,我认为这不是你想要做的。

那么你想用 2 次绘制四边形吗?一个使用默认的 Sprite Material ,另一个使用您的自定义 Material ?或者只画两次?

我不完全明白你想在这里做什么。

关于opengl - 使用自定义着色器调用 Material.setPass 会破坏 GL - Unity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30148572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com