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)

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]
Заранее спасибо)


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

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