forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Xors3D. Шейдеры. Урок первый (http://forum.boolean.name/showthread.php?t=8564)

Samodelkin 12.06.2014 20:41

Ответ: Xors3D. Шейдеры. Урок первый
 
Нужно в школе ввести отдельный предмет "Что такое поисковые системы и зачем они нужны".

Arton 12.06.2014 22:22

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Samodelkin (Сообщение 282544)
Нужно в школе ввести отдельный предмет "Что такое поисковые системы и зачем они нужны".

И психологию занудства. Тоже полезно будет.

Arton 10.08.2014 00:09

Ответ: Xors3D. Шейдеры. Урок первый
 
Вложений: 2
Копипаста из урока.
Не работают шейдеры, я запарился, хочу что бы кто-нибудь взглянул:

Вложение 20783

Каждый раз ошибка:
Вложение 20784

Если убрать проверку всё равно не работает (не накладывается/не загружается).

Samodelkin 10.08.2014 04:11

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Arton (Сообщение 285176)
Копипаста из урока.
Не работают шейдеры, я запарился, хочу что бы кто-нибудь взглянул:

Вложение 20783

Каждый раз ошибка:
Вложение 20784

Если убрать проверку всё равно не работает (не накладывается/не загружается).

Ну я не собирал, тем более с Хорсом не работал никогда, но взглядом прошелся по коду -- в шейдере у тебя в функции PSMain строка
Код:

float lit        = dot(input.normal, 8lightDirection);
имя 8lightDirection - опечатка.

Вообще это же неудобно, представь что у тебя код шейдера в несколько тысяч строк, как ты будешь опечатки искать? Если Хорс не предоставляет информацию по компиляции шейдеров, то придумай что-нибудь, например напиши свой код который использует дх напрямую, где есть отчёт о сборки шейдера.

Mr_F_ 10.08.2014 04:14

Ответ: Xors3D. Шейдеры. Урок первый
 
ксорс можно заставить выплёвывать жирный хтмл с логом ошибок, включая все ошибки компила шейдеров.
шейдер ежели не скомпилился, то вернёт ноль, дальше ты этот 0 суёшь в ValidateTechnique и крашишься.

tirarex 10.08.2014 12:41

Ответ: Xors3D. Шейдеры. Урок первый
 
Вложений: 1
Цитата:

Сообщение от Arton (Сообщение 285176)
Копипаста из урока.
Не работают шейдеры, я запарился, хочу что бы кто-нибудь взглянул:

Вложение 20783

Каждый раз ошибка:
Вложение 20784

Если убрать проверку всё равно не работает (не накладывается/не загружается).

Там было несколько ошибок.
На сайте mok'и поищи tv3d shader editor,
Полезная штуковина.

Arton 10.08.2014 18:57

Ответ: Xors3D. Шейдеры. Урок первый
 
Спасибо большое :)

Цитата:

Сообщение от Samodelkin (Сообщение 285181)
Код:

float lit        = dot(input.normal, 8lightDirection);
имя 8lightDirection - опечатка.

Вместо "8" должен было быть "-", почему-то при копирование из pdf все "-" заменились на "8" (не говоря уже о потерянном форматирование). Заменял, но не всё заметил.

У Моки утилиту давно не смог скачать т. к. она на юкозе, старую регистрацию не помню, а новая не прошла, попробую ещё раз.

Про выдачу ошибок шейдера в лог не знал.

tirarex 10.08.2014 19:26

Ответ: Xors3D. Шейдеры. Урок первый
 
Вложений: 1
Вот данная программа.

Arton 11.08.2014 01:13

Ответ: Xors3D. Шейдеры. Урок первый
 
Примечательно:

Слева текстура загружена с флагом 4, справа маска через шейдер.



Текстура DDS, сохранена в режиме "DXT5 ARGB 8 bpp | interpolated alpha", + mip-map.

Mr_F_ 11.08.2014 01:16

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Примечательно
у тебя пороговое значение обрезания разное

Arton 11.08.2014 01:24

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285219)
у тебя пороговое значение обрезания разное

Плоха понял, но в Хорсе никаких значений по обработке альфа-канала не поменять.

Короче надо юзать шейдеры, сам Хорс делает что-то не так.


Может мне кто-нибудь объяснить почему сохраняю шейдер через блокнот (винды) и он не работает, а через tv3d shader editor работает О_О
WTF&!
(а теперь всё работает... ок будем считать это локальные глюки...)

Mr_F_ 11.08.2014 01:26

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Плоха понял, но в Хорсе никаких значений по обработке альфа-канала не поменять.
xSetAlphaRef была у ксорса функция.
в шейдере просто сам выбираешь с каким значением сравнивать.

Arton 11.08.2014 01:40

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285221)
xSetAlphaRef была у ксорса функция.
в шейдере просто сам выбираешь с каким значением сравнивать.

Действительно.
Но она была переименована в xEntityAlphaRef

Samodelkin 11.08.2014 06:02

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Arton (Сообщение 285220)
Может мне кто-нибудь объяснить почему сохраняю шейдер через блокнот (винды) и он не работает, а через tv3d shader editor работает О_О
WTF&!

Возможно блокнот сохранил в UTF8, а компилятор шейдеров только в ANSI воспринимает.

Arton 11.08.2014 15:11

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Samodelkin (Сообщение 285232)
Возможно блокнот сохранил в UTF8, а компилятор шейдеров только в ANSI воспринимает.

Да должен быть ANSI, просто блокнот пошутил надомной, а я поверил. Думал файл в UTF-8 должен быть, хотя помню что Хорс с UTF не дружит.

Arton 12.08.2014 03:27

Ответ: Xors3D. Шейдеры. Урок первый
 
Поискал через яндекс и гугл (прошерстил урок Хорса), нашёл интересный урок по HLSL, но то что было нужно не увидел.

Как сделать что бы текстура с двух сторон накладывалась?

moka 12.08.2014 03:35

Ответ: Xors3D. Шейдеры. Урок первый
 
BackFace'ы?

Mr_F_ 12.08.2014 04:00

Ответ: Xors3D. Шейдеры. Урок первый
 
CullMode = None ставь в технике

Arton 12.08.2014 04:09

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285253)
CullMode = None ставь в технике

Спасибо.
Хм, а что насчёт правильного освещения?
Т. к. освещение одинаково для обеих сторон.

Mr_F_ 12.08.2014 05:17

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Хм, а что насчёт правильного освещения?
Т. к. освещение одинаково для обеих сторон.
в шейдере ты можешь определить сторону.
юзай семантику VFACE: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

в зависимости от неё флипаешь нормаль.

Arton 12.08.2014 06:15

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285256)
в шейдере ты можешь определить сторону.
юзай семантику VFACE: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

в зависимости от неё флипаешь нормаль.

Что мне делать я понял, но как не знаю, увы я знаком только с blitz basic :(

У меня тут бред да?
Код:

        int VFACE;
        if (VFACE < -1 )
        {
                        float lit        = dot(-input.normal , -lightDirection);
          }
          else
          {
                        float lit        = dot(input.normal , -lightDirection):
        }


Mr_F_ 12.08.2014 11:42

Ответ: Xors3D. Шейдеры. Урок первый
 
да, потому что ты объявляешь пустую неопределённую переменную и сравниваешь ещё с чем-то.
VFACE над вставить в входящие данные PS.
там где у тебя всякие TexCoords : TEXCOORD0, туда же вставляешь что-нибудь типа whatFace : VFACE.

Arton 12.08.2014 15:55

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285260)
да, потому что ты объявляешь пустую неопределённую переменную и сравниваешь ещё с чем-то.
VFACE над вставить в входящие данные PS.
там где у тебя всякие TexCoords : TEXCOORD0, туда же вставляешь что-нибудь типа whatFace : VFACE.

Уже делал, дебагер ругается на "lit", не объявленная переменная:



Код:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld            : MATRIX_WORLD;         

float3        lightDirection            : LIGHT0_DIRECTION;   
float4        lightColor                      : LIGHT0_COLOR;       

float4        entityColor            : COLOR_DIFFUSE;       
float          whatFace              : VFACE;

texture  diffuseTexture      : TEXTURE_0;           


sampler        diffuseSampler = sampler_state

{
        Texture = <diffuseTexture>;

        AddressU        = WRAP;
        AddressV        = WRAP;
        AddressW        = WRAP;

        MinFilter        = ANISOTROPIC;
        MagFilter        = ANISOTROPIC;
        MipFilter        = ANISOTROPIC;


        MaxAnisotropy        = 16;
};



struct        VSInput {
        float4 position  : POSITION0;
        float3 normal          : NORMAL;
        float2 texCoords : TEXCOORD0;
};



struct VSOutput {
        float4 position  : POSITION0;
        float3 normal          : TEXCOORD1;
        float2 texCoords : TEXCOORD0;
};



VSOutput VSMain(VSInput input) {


        VSOutput output;



        output.position  = mul (input.position, matrixWorldViewProj);



        output.normal          = normalize(mul(input.normal, matrixWorld));

        output.texCoords = input.texCoords;



        return output;
}


float4 PSMain( VSOutput input) : COLOR {

        float4 diffuse  = tex2D(diffuseSampler, input.texCoords);

       
        float4 color;
    color = tex2D( diffuseSampler, input.texCoords.xy);
       
        if (diffuse.a < 0.5f) discard;


        if (whatFace < -1 )
        {

                        float lit        = dot(-input.normal , -lightDirection);
        }
        else
        {
                        float lit        = dot(input.normal , -lightDirection);
        }

        return diffuse * entityColor * lit * lightColor;
}

technique Diffuse {
        pass p0 {
                PixelShader  = compile ps_3_0 PSMain();
                VertexShader = compile vs_3_0 VSMain();
               
                CullMode = none;
        }
}



______________________________

Запихал ретурн после каждого условия и понял что мой код не работает вообще. То есть освещение не флипается там где надо, у меня флипается всё.

______________________________

Кажется понял что я не так сделал. Но как сделать правильно не понял.

Samodelkin 12.08.2014 16:46

Ответ: Xors3D. Шейдеры. Урок первый
 
У каждой переменной есть область видимости (scope), которая обычно задается фигурными скобками {}. Объявленная внутри них переменная не может использоваться вне своей зоны видимости. Поэтому можно вынести объявление lit за пределы конструкции if-else:
Код:

float lit;
if ( whatFace < -1 ) {
    lit = dot( -input.normal, -lightDirection );
} else {
    lit = dot( input.normal, -lightDirection );
}
return diffuse * entityColor * lit * lightColor;

Вообще синтаксис и семантика HLSL (да и GLSL) во многом схожи с языком С. Поэтому если у тебя есть время - почитай книжки всякие про него. В отличие от С++, С не так трудно начинать изучать.

Arton 13.08.2014 02:39

Ответ: Xors3D. Шейдеры. Урок первый
 
Не понимаю почему так не работает?
Проверки тупо нету.

Код:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld            : MATRIX_WORLD;         

float3        lightDirection            : LIGHT0_DIRECTION;   
float4        lightColor                      : LIGHT0_COLOR;       

float4        entityColor            : COLOR_DIFFUSE;       
float          whatFace                          : VFACE;

texture  diffuseTexture      : TEXTURE_0;           


sampler        diffuseSampler = sampler_state

{
        Texture = <diffuseTexture>;

        AddressU        = WRAP;
        AddressV        = WRAP;
        AddressW        = WRAP;

        MinFilter        = ANISOTROPIC;
        MagFilter        = ANISOTROPIC;
        MipFilter        = ANISOTROPIC;


        MaxAnisotropy        = 16;
};



struct        VSInput {
        float4 position  : POSITION0;
        float3 normal          : NORMAL;
        float2 texCoords : TEXCOORD0;
};



struct VSOutput {
        float4 position  : POSITION0;
        float3 normal          : TEXCOORD1;
        float2 texCoords : TEXCOORD0;
};



VSOutput VSMain(VSInput input) {


        VSOutput output;



        output.position  = mul (input.position, matrixWorldViewProj);



        output.normal          = normalize(mul(input.normal, matrixWorld));

        output.texCoords = input.texCoords;



        return output;
}


float4 PSMain( VSOutput input) : COLOR {

        float4 diffuse  = tex2D(diffuseSampler, input.texCoords);

       
        float4 color;
    color = tex2D( diffuseSampler, input.texCoords.xy);
       
        if (diffuse.a < 0.5f) discard;

        float lit;
        if ( whatFace == -1 )
        {

                        lit        = dot(-input.normal , -lightDirection);
        }
        else
        {
                        lit        = dot(input.normal , -lightDirection);
                       
        }



        return diffuse * entityColor * lit * lightColor;
}

technique Diffuse {
        pass p0 {
                PixelShader  = compile ps_3_0 PSMain();
                VertexShader = compile vs_3_0 VSMain();
               
                CullMode = none;
        }
}



Слева Хорс, справа шейдер:


Mr_F_ 13.08.2014 02:59

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

if ( whatFace == -1 )
попробуй if ( whatFace < 0 ), не уверен что там точное значение стоит на каждый фейс.

Arton 13.08.2014 03:32

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285273)
попробуй if ( whatFace < 0 ), не уверен что там точное значение стоит на каждый фейс.

Сделала в первую очередь :(

Как ещё можно сделать подобную штуку? Попробовать считать свет для обеих сторон?

Mr_F_ 13.08.2014 03:44

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

float whatFace : VFACE;
только сейчас заметил, что он у тебя как глобал объявлен.
нужно в VSOutput вставить.
в глобале только то, что одинаково на весь шейдер.
в VSOutput у тебя то, что приходит в пиксельный шейдер из VS интерполированное, и VFACE дополнительно из растеризатора - это инфа попиксельная.

Arton 13.08.2014 04:12

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285275)
только сейчас заметил, что он у тебя как глобал объявлен.
нужно в VSOutput вставить.
в глобале только то, что одинаково на весь шейдер.
в VSOutput у тебя то, что приходит в пиксельный шейдер из VS интерполированное, и VFACE дополнительно из растеризатора - это инфа попиксельная.

Но, как это правильно сделать?
Если так то переменная "whatFace" не найдена:

Код:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld            : MATRIX_WORLD;         

float3        lightDirection            : LIGHT0_DIRECTION;   
float4        lightColor                      : LIGHT0_COLOR;       

float4        entityColor            : COLOR_DIFFUSE;       

texture  diffuseTexture      : TEXTURE_0;           


sampler        diffuseSampler = sampler_state

{
        Texture = <diffuseTexture>;

        AddressU        = WRAP;
        AddressV        = WRAP;
        AddressW        = WRAP;

        MinFilter        = ANISOTROPIC;
        MagFilter        = ANISOTROPIC;
        MipFilter        = ANISOTROPIC;


        MaxAnisotropy        = 16;
};



struct        VSInput {
        float4 position  : POSITION0;
        float3 normal          : NORMAL;
        float2 texCoords : TEXCOORD0;
};



struct VSOutput {
        float4 position  : POSITION0;
        float3 normal          : TEXCOORD1;
        float2 texCoords : TEXCOORD0;
        float whatFace  : VFACE;
};



VSOutput VSMain(VSInput input) {


        VSOutput output;

        output.position  = mul (input.position, matrixWorldViewProj);


        output.normal          = normalize(mul(input.normal, matrixWorld));

        output.texCoords = input.texCoords;



        return output;
}


float4 PSMain( VSOutput input) : COLOR {

        float4 diffuse  = tex2D(diffuseSampler, input.texCoords);
       
       
        float4 color;
    color = tex2D( diffuseSampler, input.texCoords.xy);
       
        if (diffuse.a < 0.5f) discard;

        float lit;

        if ( whatFace == -1 )
        {

                        lit        = dot(-input.normal , -lightDirection);
        }
        else
        {
                        lit        = dot(input.normal , -lightDirection);
                       
        }



        return diffuse * entityColor * lit * lightColor;
}

technique Diffuse {
        pass p0 {
                PixelShader  = compile ps_3_0 PSMain();
                VertexShader = compile vs_3_0 VSMain();
               
                CullMode = none;
        }
}


Mr_F_ 13.08.2014 04:14

Ответ: Xors3D. Шейдеры. Урок первый
 
ну потому что теперь ты её должен читать как input.whatFace. так же как и всё, что ты читаешь из VSOutput.

Arton 13.08.2014 04:34

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285279)
ну потому что теперь ты её должен читать как input.whatFace. так же как и всё, что ты читаешь из VSOutput.

То есть так?

Код:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld            : MATRIX_WORLD;         

float3        lightDirection            : LIGHT0_DIRECTION;   
float4        lightColor                      : LIGHT0_COLOR;       

float4        entityColor            : COLOR_DIFFUSE;       

texture  diffuseTexture      : TEXTURE_0;           


sampler        diffuseSampler = sampler_state

{
        Texture = <diffuseTexture>;

        AddressU        = WRAP;
        AddressV        = WRAP;
        AddressW        = WRAP;

        MinFilter        = ANISOTROPIC;
        MagFilter        = ANISOTROPIC;
        MipFilter        = ANISOTROPIC;


        MaxAnisotropy        = 16;
};



struct        VSInput {
        float4 position  : POSITION0;
        float3 normal    : NORMAL;
        float2 texCoords : TEXCOORD0;
        float  whatFace : VFACE;
};



struct VSOutput {
        float4 position  : POSITION0;
        float3 normal          : TEXCOORD1;
        float2 texCoords : TEXCOORD0;
        float  whatFace        : VFACE;
       
};



VSOutput VSMain(VSInput input) {


        VSOutput output;
       
        output.position  = mul (input.position, matrixWorldViewProj);


        output.normal          = normalize(mul(input.normal, matrixWorld));

        output.texCoords = input.texCoords;
       
        output.whatFace        = input.whatFace;



        return output;
}


float4 PSMain( VSOutput input) : COLOR {

        float4 diffuse  = tex2D(diffuseSampler, input.texCoords);
       
        float4 color;
    color = tex2D( diffuseSampler, input.texCoords.xy);
       
        if (diffuse.a < 0.5f) discard;

        float lit;

        if ( input.whatFace == -1 )
        {

                        lit        = dot(-input.normal , -lightDirection);
        }
        else
        {
                        lit        = dot(input.normal , -lightDirection);
                       
        }


        return diffuse * entityColor * lit * lightColor;
}

technique Diffuse {
        pass p0 {
                PixelShader  = compile ps_3_0 PSMain();
                VertexShader = compile vs_3_0 VSMain();
               
                CullMode = none;
        }
}



Дебагер говорит инвалид:
Цитата:

(35): error X4502: invalid input semantic 'VFACE'
(99): ID3DXEffectCompiler::CompileEffect: There was an error compiling expression
ID3DXEffectCompiler: Compilation failed

Samodelkin 13.08.2014 05:33

Ответ: Xors3D. Шейдеры. Урок первый
 
VFACE нету на входе в вершинный шейдер - он вычисляется автоматически между вершинным и пиксельным шейдером. Поэтому он не может быть в структуре VSInput.
Попробуй сначала убрать whatFace из VSInput а в вершинном шейдере ничего не присваивай output.whatFace или присвой 0.
А уже из пиксельного ты можешь обратиться к ней как input.whatFace и в ней уже будет содержаться нужное значение.
Должно работать.
Однако если вдруг компилятор всё-равно скажет что нет такой семантики (хотя вроде не должен), тогда тебе придется разделить VSOutput на две разные структуры - VSOutput и PSInput, и во второй добавишь VFACE.

Arton 13.08.2014 06:35

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Samodelkin (Сообщение 285282)
VFACE нету на входе в вершинный шейдер - он вычисляется автоматически между вершинным и пиксельным шейдером. Поэтому он не может быть в структуре VSInput.
Попробуй сначала убрать whatFace из VSInput а в вершинном шейдере ничего не присваивай output.whatFace или присвой 0.
А уже из пиксельного ты можешь обратиться к ней как input.whatFace и в ней уже будет содержаться нужное значение.
Должно работать.

Не сработало, куча ошибок.

Цитата:

Однако если вдруг компилятор всё-равно скажет что нет такой семантики (хотя вроде не должен), тогда тебе придется разделить VSOutput на две разные структуры - VSOutput и PSInput, и во второй добавишь VFACE.
:??

Код:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld            : MATRIX_WORLD;         

float3        lightDirection            : LIGHT0_DIRECTION;   
float4        lightColor                      : LIGHT0_COLOR;       

float4        entityColor            : COLOR_DIFFUSE;       

texture  diffuseTexture      : TEXTURE_0;           


sampler        diffuseSampler = sampler_state

{
        Texture = <diffuseTexture>;

        AddressU        = WRAP;
        AddressV        = WRAP;
        AddressW        = WRAP;

        MinFilter        = ANISOTROPIC;
        MagFilter        = ANISOTROPIC;
        MipFilter        = ANISOTROPIC;


        MaxAnisotropy        = 16;
};



struct        VSInput {
        float4 position  : POSITION0;
        float3 normal          : NORMAL;
        float2 texCoords : TEXCOORD0;
};



struct VSOutput {

        float4 position  : POSITION0;
        float3 normal          : TEXCOORD1;
        float2 texCoords : TEXCOORD0;
       
}

        PSInput {
       
        float  whatFace        : VFACE;

       
};



VSOutput VSMain(VSInput input) {


        VSOutput output;
       
        output.position  = mul (input.position, matrixWorldViewProj);


        output.normal          = normalize(mul(input.normal, matrixWorld));

        output.texCoords = input.texCoords;
       
       
        output.whatFace = iput.whatFace;



        return output;
}


float4 PSMain( VSOutput input) : COLOR {

        float4 diffuse  = tex2D(diffuseSampler, input.texCoords);
       
        float4 color;
    color = tex2D( diffuseSampler, input.texCoords.xy);
       
        if (diffuse.a < 0.5f) discard;

        float lit;

        if ( input.whatFace == -1 )
        {

                        lit        = dot(-input.normal , -lightDirection);
        }
        else
        {
                        lit        = dot(input.normal , -lightDirection);
                       
        }


        return diffuse * entityColor * lit * lightColor;
}

technique Diffuse {
        pass p0 {
                PixelShader  = compile ps_3_0 PSMain();
                VertexShader = compile vs_3_0 VSMain();
               
                CullMode = none;
        }
}


Mr_F_ 13.08.2014 11:45

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

iput
iput, ок. и вообще убери эту строку полностью.

+ не надо ничего разделять, просто блин оставь так
struct VSOutput {

float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
float whatFace : VFACE
}

Arton 13.08.2014 15:09

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285284)
iput, ок. и вообще убери эту строку полностью.

+ не надо ничего разделять, просто блин оставь так
struct VSOutput {

float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
float whatFace : VFACE
}

О, это уже не соображал.

Так тоже сделала в первую очередь:

Код:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld            : MATRIX_WORLD;         

float3        lightDirection            : LIGHT0_DIRECTION;   
float4        lightColor                      : LIGHT0_COLOR;       

float4        entityColor            : COLOR_DIFFUSE;       

texture  diffuseTexture      : TEXTURE_0;           


sampler        diffuseSampler = sampler_state

{
        Texture = <diffuseTexture>;

        AddressU        = WRAP;
        AddressV        = WRAP;
        AddressW        = WRAP;

        MinFilter        = ANISOTROPIC;
        MagFilter        = ANISOTROPIC;
        MipFilter        = ANISOTROPIC;


        MaxAnisotropy        = 16;
};



struct        VSInput {
        float4 position  : POSITION0;
        float3 normal          : NORMAL;
        float2 texCoords : TEXCOORD0;
};



struct VSOutput {

        float4 position : POSITION0;
        float3 normal : TEXCOORD1;
        float2 texCoords : TEXCOORD0;
        float whatFace : VFACE;

};



VSOutput VSMain(VSInput input) {


        VSOutput output;
       
        output.position  = mul (input.position, matrixWorldViewProj);


        output.normal          = normalize(mul(input.normal, matrixWorld));

        output.texCoords = input.texCoords;




        return output;
}


float4 PSMain( VSOutput input) : COLOR {

        float4 diffuse  = tex2D(diffuseSampler, input.texCoords);
       
        float4 color;
    color = tex2D( diffuseSampler, input.texCoords.xy);
       
        if (diffuse.a < 0.5f) discard;

        float lit;

        if ( input.whatFace == -1 )
        {

                        lit        = dot(-input.normal , -lightDirection);
        }
        else
        {
                        lit        = dot(input.normal , -lightDirection);
                       
        }


        return diffuse * entityColor * lit * lightColor;
}

technique Diffuse {
        pass p0 {
                PixelShader  = compile ps_3_0 PSMain();
                VertexShader = compile vs_3_0 VSMain();
               
                CullMode = none;
        }
}



Дебагер говорит:
Цитата:

(65): error X4000: variable 'output' used without having been completely initialized
(98 ): ID3DXEffectCompiler::CompileEffect: There was an error compiling expression
ID3DXEffectCompiler: Compilation failed

Mr_F_ 13.08.2014 15:29

Ответ: Xors3D. Шейдеры. Урок первый
 
попробуй тогда убрать его из VSOutput, а вместо этого PSMain поменять типа
float4 PSMain(VSOutput input, float whatFace : VFACE) : COLOR {

Arton 13.08.2014 15:59

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285289)
попробуй тогда убрать его из VSOutput, а вместо этого PSMain поменять типа
float4 PSMain(VSOutput input, float whatFace : VFACE) : COLOR {

error X3018: invalid subscript 'whatFace'

Нифига не понимаю, попробовал в шейдерах других игр покопаться, не нашёл.

Mr_F_ 13.08.2014 16:17

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

error X3018: invalid subscript 'whatFace'
теперь она же не из структуры input приходит, а отдельно.
так что замени input.whatFace на просто whatFace ниже.

Arton 13.08.2014 16:30

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Сообщение от Mr_F_ (Сообщение 285291)
теперь она же не из структуры input приходит, а отдельно.
так что замени input.whatFace на просто whatFace ниже.

Большое спасибо, всё работает :)



Какая разница между записью данных в структуру:
Код:

struct VSOutput {

        float4 position  : POSITION0;
        float3 normal          : TEXCOORD1;
        float2 texCoords : TEXCOORD0;
        float whatFace          : VFACE;

};

И тут:
Код:

float4 PSMain(VSOutput input, float whatFace : VFACE) : COLOR {
?

Почему в первом случае надо писать input, а во втором нет?

Mr_F_ 13.08.2014 17:04

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Какая разница между записью данных в структуру
по большому счёту никакой, только структуру ты ретурнишь, и типа считается что ты её должен до конца заполнить поэтому.

Цитата:

Почему в первом случае надо писать input,
потому что у тебя в PS объявлена переменная, которая называется "input". и она содержит поля структуры.

Цитата:

VSOutput input, float whatFace
VSOutput, float - тип переменной
input, whatFace - имя

Samodelkin 13.08.2014 17:55

Ответ: Xors3D. Шейдеры. Урок первый
 
2Arton
struct A { ... }; это описание структуры, то есть как шаблон, реальный объект при этом не создается.
Объект структуры создается так:
A object; - то есть сначала тип, потом имя объекта.
Если нужно обратиться к полю созданного объекта:
object.value;

Теперь вот смотри, в графическом конвеере не всё делают шейдеры. То есть в частности между вершинным и пиксельным тоже происходят скрытые вычисления. То есть это я к тому что если структура VSOutput у тебя определена один раз, то объекта два. Сначала создаешь output в вершинном шейдере и записываешь туда явно вычисленные значения, затем происходят скрытые вычисления, и в пиксельный шейдер тебе возвращается уже другой объект, даже если он того же типа, значения полей будут другими - это важно понимать. В данном случае ты одной структурой описал объекты для выходных вершинных и входных пиксельных данных, но иногда бывают другие ситуации, когда данные различаются и нужно например объявлять отдельно VSOutput и PSInput.

Также вот в такая запись:
float4 PSMain( float4 pos : POSITION0, float whatFace : VFACE ) {...}
будет эквивалентна такой:
struct PSInput {
float4 pos : POSITION0;
float whatFace : VFACE;
};
float4 PSMain( PSInput input ) {...}
Во втором случае мы все входные параметры описали одной стрктурой и передали в качестве аргумента все параметры как один объект.
Только внутри функции уже нужно обращаться к параметрам как к полям объекта input.pos и т. д.
Точно также мы можем объявить и выходную структуру, например в данном случае будет:
struct PSOutput {
float4 col : COLOR0;
};
В данном случае для одного параметра это избыточно, но механизм я думаю ясен.

Izunad 24.08.2014 18:15

Ответ: Xors3D. Шейдеры. Урок первый
 
Почему нельзя использовать цвет в качестве числа???
Код:

index=tex2D(MixSampler,input.texCoords).r;
Colorka=tex2D(TS[index],input.texCoords);


Mr_F_ 24.08.2014 18:20

Ответ: Xors3D. Шейдеры. Урок первый
 
какую ошибку пишет?

Izunad 24.08.2014 18:27

Ответ: Xors3D. Шейдеры. Урок первый
 
Ошибку не выдает, просто отказывается закрашивать модель текстурой. в Итоге получается серая моделька.

Идея была такая: Картинка[R,G,B,A]
R-индекс первой текстуры
G-индекс второй текстуры
B-коэффициент смешивания

одиннадцать текстур TS[0],TS[1]..TS[10]

Mr_F_ 24.08.2014 20:34

Ответ: Xors3D. Шейдеры. Урок первый
 
Цитата:

Ошибку не выдает, просто отказывается закрашивать модель текстурой. в Итоге получается серая моделька.
в ксорсе можно включить лог.
в лог пишутся ошибки компиляции шейдеров.
читай их.

Izunad 24.08.2014 22:40

Ответ: Xors3D. Шейдеры. Урок первый
 
Can't create effect from file 'Resurses\Shaders\EXP\EXP.fx'!
E:\SkinBattle - копия\Resurses\Shaders\EXP\EXP.fx(165,61): error X3000: syntax error: unexpected token ')'

Mr_F_ 25.08.2014 00:37

Ответ: Xors3D. Шейдеры. Урок первый
 
ну и что, по-твоему, здесь написано?)

Arton 25.08.2014 04:00

Ответ: Xors3D. Шейдеры. Урок первый
 
Скачай дебагер-то, всяко сподручнее чем лог.

Izunad 25.08.2014 10:30

Ответ: Xors3D. Шейдеры. Урок первый
 
Я уже поржал над собой ')'

Код:

index=tex2D(MixSampler,input.texCoords).r;
Colorka=tex2D(TS[index],input.texCoords);

Вот настоящая ошибка
Ошибка X3512: сэмплер индекс массива должен быть буквенное выражение
(174): ID3DXEffectCompiler :: CompileEffect: Был выражение об ошибке компиляции
ID3DXEffectCompiler: Компиляция не удалось

Mr_F_ 25.08.2014 11:42

Ответ: Xors3D. Шейдеры. Урок первый
 
а, ну да. в ps3_0 и ниже нельзя использовать честное динамическое индексирование в массив, увы. в вертексном можно.

ты можешь запихать текстуры в атлас или 3д текстуру и вместо индекса смещать текстурные координаты.

Izunad 25.08.2014 11:57

Ответ: Xors3D. Шейдеры. Урок первый
 
Я решил смешивать текстуры без шейдеров, так как текстуры статичны и не особо большого размера

Пример
Код:

IncludeFile "Xors3D.pbi":xGraphics3D(0,0,16,0,#False)

Global Image=xCreateImage(512,512)
Global Dim ImageList(40)
For i=0 To 40
  ImageList(i)=xLoadImage("Str(i)+".jpg")
Next


Procedure Mixer(PosX,PosY,Image1,Image2,K.f)
  If PosX>#False And PosY>#False And PosX<1024 And PosY<1024
    RGB1=xReadPixel(PosX,PosY,xImageBuffer(ImageList(Image1)))
    R1=Red(RGB1):G1=Green(RGB1):B1=Blue(RGB1)
    RGB2=xReadPixel(PosX,PosY,xImageBuffer(ImageList(Image2)))
    R2=Red(RGB2):G2=Green(RGB2):B2=Blue(RGB2)
    K1.f=K
    K2.f=1-K
    xColor((R1*K1+R2*K2)/2,(G1*K1+G2*K2)/2,(G1*K1+G2*K2)/2)
    xSetBuffer(xImageBuffer(Image))
    xRect (PosX,PosY,1,1,1)
    xSetBuffer(xBackBuffer())
  EndIf
EndProcedure





For x=0 To 512
  For y=0 To 512
    Mixer(x,y,0,13,1,0.5)
  Next
Next

xSaveImage(image,"123.bmp")
Repeat
  xUpdateWorld()
  xRenderWorld()
  xDrawImage(Image,0,0)
  xFlip()
  xCls()
ForEver

Код довожу до ума так как алгоритм смешивания на самом деле сложнее

Владислав 13.09.2014 10:25

Ответ: Xors3D. Шейдеры. Урок первый
 
Остался у кого-нибудь урок по шейдерам? помню это pdf файл, но у емня он задевался куда-то
Прошу выложите кто-нибудь, или на почту [email protected]
Заранее спасибо)

tirarex 13.09.2014 12:35

Ответ: Xors3D. Шейдеры. Урок первый
 
Вложений: 1
Вот

Владислав 14.09.2014 07:29

Ответ: Xors3D. Шейдеры. Урок первый
 
Спасибо!
кстати, есть прогресс с деферредом? я отписал на gd

pozitiffcat 14.10.2014 23:17

Ответ: Xors3D. Шейдеры. Урок первый
 
Прогресса впринципе быть не может, т.к. движок забит.

tirarex 15.10.2014 00:03

Ответ: Xors3D. Шейдеры. Урок первый
 
Вложений: 1
Ты не много не в курсе про деферред =)


Izunad 21.01.2015 03:23

Ответ: Xors3D. Шейдеры. Урок первый
 
Я не могу понять одну весчъ. Если применить к двум мешам шейдер с одинаковой текстурой в памяти видеокарты будут две копии текстуры? Возможно ли создать в памяти единственную текстуру для двух мешей с одним шейдером?

moka 21.01.2015 03:27

Ответ: Xors3D. Шейдеры. Урок первый
 
Если ты проверил и это на самом деле происходит, то ответ: возможно, только не уверен что движок это "позволит". По идее вообще не должно быть двух текстур, а лишь одна, иначе это нонсенс, одна большая текстура и несколько шейдеров, этож сколько VRAM'а заюзается..

Mr_F_ 21.01.2015 13:41

Ответ: Xors3D. Шейдеры. Урок первый
 
я помню момент, когда в ксорс добавили менеджер ресурсов, с того момента текстуры стали загружаться единично и референситься дальше.
так что всё должно быть ок, если только там какой-нибудь баг не закрался.


Часовой пояс GMT +4, время: 19:20.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot