Кривые нормали на дефолтной сфере

Шейдеры и все-все-все.

Кривые нормали на дефолтной сфере

Сообщение Chaz 14 июл 2015, 17:23

Привки. Вот у меня вообще такая задачка - зарисовать сектор сферы. Ну и я пробовал-пробовал, а потом выяснилось, что не то пробовал, потому что то ли я неверно понял, как устроены нормали, то ли это какой-то глюк.
Смарите код
Синтаксис:
Используется glsl
Shader "MyShaders/Shield" {
SubShader {
    Pass {

CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members dotValue)
#pragma exclude_renderers d3d11 xbox360
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

struct v2f {
    float4 pos : POSITION0;
        float3 nor : COLOR0;
};

v2f vert (appdata_base v)
{
    v2f o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
        o.nor = v.normal;
    return o;
}

half4 frag (v2f i) : COLOR
{
if(i.nor.x==0.0)
    return half4 (1,0,0, 1);

        return half4(0,0,0,1);
}
ENDCG

    }
}
Fallback "VertexLit"
}
 

По идее компонента X равна там, где она незадействована. В случае сферы это долбно быть колечко в плоскости YZ проходящее через центр сферы.
Но рисуется какая-то фигня.
Изображение
Закрашивается половина сферы и то, с какими-то дефектами.
Чому так?
Chaz
Адепт
 
Сообщения: 1412
Зарегистрирован: 07 апр 2012, 11:24

Re: Кривые нормали на дефолтной сфере

Сообщение Chaz 14 июл 2015, 18:18

Нуу, если нормализовать, чтоб значения были от 0 до 1, то норм робит
Chaz
Адепт
 
Сообщения: 1412
Зарегистрирован: 07 апр 2012, 11:24

Re: Кривые нормали на дефолтной сфере

Сообщение Woolf 14 июл 2015, 18:24

if(i.nor.x==0.0)

это кто вас так учил дробные значения на == проверять?
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Кривые нормали на дефолтной сфере

Сообщение Chaz 14 июл 2015, 18:56

Woolf писал(а):
if(i.nor.x==0.0)

это кто вас так учил дробные значения на == проверять?

а как их еще проверять?
Chaz
Адепт
 
Сообщения: 1412
Зарегистрирован: 07 апр 2012, 11:24

Re: Кривые нормали на дефолтной сфере

Сообщение MF_Andreich 14 июл 2015, 19:03

Chaz писал(а):
Woolf писал(а):
if(i.nor.x==0.0)

это кто вас так учил дробные значения на == проверять?

а как их еще проверять?


abs(x) <= 0.0001

хотя бы так. Проверять надо на близость к нулю.
Holly Shovel Team
Аватара пользователя
MF_Andreich
Старожил
 
Сообщения: 924
Зарегистрирован: 20 июн 2013, 10:09
Откуда: Барнаул
Skype: mf_andreich
  • ICQ

Re: Кривые нормали на дефолтной сфере

Сообщение Chaz 14 июл 2015, 19:09

MF_Andreich писал(а):
Chaz писал(а):
Woolf писал(а):
if(i.nor.x==0.0)

это кто вас так учил дробные значения на == проверять?

а как их еще проверять?


abs(x) <= 0.0001

хотя бы так. Проверять надо на близость к нулю.

да знаю я это, я ставил на то, что когда-то оно все таки будет равно нулю
Chaz
Адепт
 
Сообщения: 1412
Зарегистрирован: 07 апр 2012, 11:24

Re: Кривые нормали на дефолтной сфере

Сообщение MF_Andreich 15 июл 2015, 07:49

Попробуйте так =)
Синтаксис:
Используется csharp
SubShader {
    Pass {

CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members dotValue)
#pragma exclude_renderers d3d11 xbox360
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

struct v2f {
    float4 pos : POSITION0;
        float3 nor : COLOR0;
};

v2f vert (appdata_base v)
{
    v2f o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
        o.nor = v.normal/2.0f + 0.5f;
    return o;
}

half4 frag (v2f i) : COLOR
{      
        float3 norm = i.nor * 2.0f - 1.0f;
       
if(abs(norm.x)<=0.1)
    return half4 (1,0,0, 1);

        return half4(0,0,0,1);
}
ENDCG

    }
}
Fallback "VertexLit"
}
 


Но кое где будут весьма уродливые результаты... нормали посчитаны у стандартной сферы не очень то добротно =)
Holly Shovel Team
Аватара пользователя
MF_Andreich
Старожил
 
Сообщения: 924
Зарегистрирован: 20 июн 2013, 10:09
Откуда: Барнаул
Skype: mf_andreich
  • ICQ

Re: Кривые нормали на дефолтной сфере

Сообщение Chaz 16 июл 2015, 12:50

MF_Andreich писал(а):Попробуйте так =)
Синтаксис:
Используется csharp
SubShader {
    Pass {

CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members dotValue)
#pragma exclude_renderers d3d11 xbox360
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

struct v2f {
    float4 pos : POSITION0;
        float3 nor : COLOR0;
};

v2f vert (appdata_base v)
{
    v2f o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
        o.nor = v.normal/2.0f + 0.5f;
    return o;
}

half4 frag (v2f i) : COLOR
{      
        float3 norm = i.nor * 2.0f - 1.0f;
       
if(abs(norm.x)<=0.1)
    return half4 (1,0,0, 1);

        return half4(0,0,0,1);
}
ENDCG

    }
}
Fallback "VertexLit"
}
 


Но кое где будут весьма уродливые результаты... нормали посчитаны у стандартной сферы не очень то добротно =)

Нуу, оно рисует полосочку. Так и должно быть?
Chaz
Адепт
 
Сообщения: 1412
Зарегистрирован: 07 апр 2012, 11:24

Re: Кривые нормали на дефолтной сфере

Сообщение MF_Andreich 16 июл 2015, 13:09

Chaz писал(а):По идее компонента X равна там, где она незадействована. В случае сферы это долбно быть колечко в плоскости YZ проходящее через центр сферы.
Но рисуется какая-то фигня.


Не то? Если не то, требую более адекватное описание того, что же вам нужно то в итоге =)
Holly Shovel Team
Аватара пользователя
MF_Andreich
Старожил
 
Сообщения: 924
Зарегистрирован: 20 июн 2013, 10:09
Откуда: Барнаул
Skype: mf_andreich
  • ICQ


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3