O que há de Novo?
Fórum Outer Space - O maior fórum de games do Brasil

Registre uma conta gratuita hoje para se tornar um membro! Uma vez conectado, você poderá participar neste site adicionando seus próprios tópicos e postagens, além de se conectar com outros membros por meio de sua própria caixa de entrada privada!

  • Anunciando os planos GOLD no Fórum Outer Space
    Visitante, agora você pode ajudar o Fórum Outer Space e receber alguns recursos exclusivos, incluindo navegação sem anúncios e dois temas exclusivos. Veja os detalhes aqui.


[Unity] Problemas com efeito estilo Sin City!

Marbow

Bam-bam-bam
Mensagens
5.559
Reações
6.740
Pontos
344
Oi pessoal! Estou testando um shader pra fazer um filtro estilo sin city (Tudo em tons de cinza e vermelho), mas eu só estou conseguindo fazer tudo ficar em tons de cinza.

Fiz uma outra câmera sem o shader e marquei todos os objetos vermelhos com uma tag de "red" e fiz essa câmera só ver esses objetos e a câmera principal não. Deu certo, mas deve ter um jeito melhor de fazer isso. Se puderem me ajudar.
 

PCdubaum

Ei mãe, 500 pontos!
Mensagens
12.582
Reações
14.623
Pontos
619
Well, vamos lá...

Se fosse um jogo desenvolvido do zero eu sugeriria começar criando tudo em cinza ou vermelho, mas acho que não é essa intenção.

Nunca mexi com os shaders no Unity mas acho que é o bom e velho Pixel Shader e HLSL com retorno de pixel em R8G8B8A8.

A nivel de PS vc terá entrada de correr RGBA, se você estiver usando o shader em modo deferred então vc não vai precisar de alpha, então a minha solução é fazer uma checagem antes de recortar a cor do Pixel em que A = 1.0f é vermelho e A = 0.0f é cinza. Caso seja cinza os valores RGB vão receber o valor mais alto entre os 3, caso seja vermelho os valores GB vão ser 0.

Caso vc esteja usando forwarding shader vc terá que fazer outro tipo de checagem então eu sugiro checar o valor R, se R for maior que GB esse objeto será vermelho, segue o que eu disse acima, caso contrário será cinza.

Acho que é por ae.
 

Marbow

Bam-bam-bam
Mensagens
5.559
Reações
6.740
Pontos
344
Well, vamos lá...

Se fosse um jogo desenvolvido do zero eu sugeriria começar criando tudo em cinza ou vermelho, mas acho que não é essa intenção.

Nunca mexi com os shaders no Unity mas acho que é o bom e velho Pixel Shader e HLSL com retorno de pixel em R8G8B8A8.

A nivel de PS vc terá entrada de correr RGBA, se você estiver usando o shader em modo deferred então vc não vai precisar de alpha, então a minha solução é fazer uma checagem antes de recortar a cor do Pixel em que A = 1.0f é vermelho e A = 0.0f é cinza. Caso seja cinza os valores RGB vão receber o valor mais alto entre os 3, caso seja vermelho os valores GB vão ser 0.

Caso vc esteja usando forwarding shader vc terá que fazer outro tipo de checagem então eu sugiro checar o valor R, se R for maior que GB esse objeto será vermelho, segue o que eu disse acima, caso contrário será cinza.

Acho que é por ae.

Vlw! Vou tentar aqui.

Ah e aqui o script que estou usando:

Shader "Shaders Sala de Aula/AulaShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};

v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
return o;
}

sampler2D _MainTex;

fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
// just invert the colors
float media = (col.r + col.g + col.b) / 1.0f;
col.r = media;
col.g = media;
col.b = media;
return col;
}
ENDCG
}
}
}
 

Marbow

Bam-bam-bam
Mensagens
5.559
Reações
6.740
Pontos
344
Well, vamos lá...

Se fosse um jogo desenvolvido do zero eu sugeriria começar criando tudo em cinza ou vermelho, mas acho que não é essa intenção.

Nunca mexi com os shaders no Unity mas acho que é o bom e velho Pixel Shader e HLSL com retorno de pixel em R8G8B8A8.

A nivel de PS vc terá entrada de correr RGBA, se você estiver usando o shader em modo deferred então vc não vai precisar de alpha, então a minha solução é fazer uma checagem antes de recortar a cor do Pixel em que A = 1.0f é vermelho e A = 0.0f é cinza. Caso seja cinza os valores RGB vão receber o valor mais alto entre os 3, caso seja vermelho os valores GB vão ser 0.

Caso vc esteja usando forwarding shader vc terá que fazer outro tipo de checagem então eu sugiro checar o valor R, se R for maior que GB esse objeto será vermelho, segue o que eu disse acima, caso contrário será cinza.

Acho que é por ae.

Oi! Desculpe a noobice, mas não consegui escrever isso em formato de script para colocar na unity ><

Como eu faço?
 

PCdubaum

Ei mãe, 500 pontos!
Mensagens
12.582
Reações
14.623
Pontos
619
Oi! Desculpe a noobice, mas não consegui escrever isso em formato de script para colocar na unity ><

Como eu faço?
Shader "Shaders Sala de Aula/AulaShader"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_Color("Color", Color) = (1,1,1,1)
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};

v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
return o;
}

sampler2D _MainTex;
fixed4 _Color;

fixed4 frag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv) * _Color;

if (col.r >= col.b || col.r >= col.g)
{
col.b = 0.0f;
col.g = 0.0f;
}
else
{
if (col.g >= col.b)
{
col.r = col.g;
col.b = col.g;
}
else
{
col.r = col.b;
col.g = col.b;
}
}


return col;
}
ENDCG
}
}
}

Vc pode ajustar os valores para que sempre saia um cinza mais forte ou um vermelho mais forte.

if (col.r >= col.b || col.r >= col.g)
{
col.r = (col.r + 1.0f) / 2.0f;
col.b = 0.0f;
col.g = 0.0f;
}
else
{
if (col.g >= col.b)
{
float g = (col.g + 1.0f) / 2.0f;
col.r = g;
col.g = g;
col.b = g;
}
else
{
float b = (col.b + 1.0f) / 2.0f;
col.r = b;
col.g = b;
col.b = b;
}
}
 
Ultima Edição:
Topo Fundo