Войти
IrrlichtФорум

HLSL в irrlicht

Advanced: Тема повышенной сложности или важная.

#0
5:14, 2 янв. 2010

Сновым Годом!!!

вот занялся шейдерами(опять).

и вобщем в полне рабочий шейдер не работает, как и обсолютно все( кроме тех что в media).
Помогите заставить работать простой шейдер на иррлихте...

вот шейдер:

//ambient lighting
float4x4 mWorldViewProj;  // World * View * Projection transformation
float4 mLightColor;       // Light color

// Vertex shader output structure
struct VS_OUTPUT
{
  float4 Position   : POSITION;   // vertex position 

};

VS_OUTPUT vertexMain( in float4 vPosition : POSITION )
{
  VS_OUTPUT Output;

  // transform position to clip space 
  Output.Position = mul(vPosition, mWorldViewProj);
  
    return Output;
}

float4 pixelMain() :COLOR0
{ 
  return mLightColor * 2.0 ;
}


#1
23:43, 2 янв. 2010

я, честно говоря, хз насчет HLSL я больше по OGL.
Но мне кажеться, что тут будет серый или белый экран (объект).

А так дежурные вопросы
-Демки работают?
-Какой профиль компиляции
-Какой код для загрузки\отрисовки шейдера?

ну и хватит для начала.

#2
16:46, 3 янв. 2010

по идее да, тут довольно темный объект будет.... а что именно не работает у тебя?

#3
5:53, 4 янв. 2010

Тут вроде верно всё. Правда, что именно не работает?
У меня вот в Иррлихте не получается задавать произвольное число параметров. Если больше 4-х, то он не может назначить им значение, говорит, таких нет. Да и с четырьмя трудности бывают. Я тут уже писал где-то об этом...

#4
12:17, 5 янв. 2010

у меня одна проблема с шейдерами была, слишком большое кол-во инструкций... но теперь все работает тип топ! =)

#5
12:26, 5 янв. 2010
log | HLSL в irrlicht

вот что пишет в log постоянно...
хотя вы правы шейдер работает, но что значят эти сообщения

ЗЫ: fps упал до 30

#6
1:03, 6 янв. 2010

Rip
Вот и у меня пишет то же. Разумеется с другими идентификаторами.
Это движок выдаёт тебе сообщение об ошибке - он не может установить значения переменных передаваемые в шейдер, так как не видит эти переменные в коде шейдера. И приводит список тех переменных, которые он видит. То есть в твоём случае движок видит переменные mWorldViewProj и mLightColor, и не видит mTransWorld, mInvWorld и mLightPos, о чём тебе и говорит. Правда, если код шейдера остался таким, как в нулевом посте, то всё работает верно - таких переменных в нём нет. Значит ты просто забыл убрать установку их значений в функции OnSetConstants() класса MyShaderCallBack (говорю названия из примера Иррлихта Shaders).
У меня же проблема была в том, что такие же сообщения выдавались мне, когда переменные были в коде. Иррлихт их просто не видел и говорил, что их нет! :(

#7
19:19, 7 янв. 2010

Wolshebnik

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

Прошло более 1 года
#8
5:55, 27 дек. 2011

Вот так надо...

//ambient lighting
float4x4 mWorldViewProj;   // World * View * Projection transformation
float4 mLightColor;        // Light color

struct VS_OUTPUT
{
   float4 Position: POSITION0;
   float4 Ambient : COLOR0;
   float2 TexCoord: TEXCOORD0;
};


VS_OUTPUT vertexMain( float4 Position: POSITION0, float4 Ambient : COLOR0, float2 TexCoord: TEXCOORD0)
{
   VS_OUTPUT Output;

   Output.Position = mul(Position, mWorldViewProj);
   Output.TexCoord = TexCoord;

   float4 tmp = mLightColor;
   Output.Ambient = float4(tmp.x, tmp.y, tmp.z, 1);

   return(Output);
}


// Pixel shader output structure
struct PS_OUTPUT
{
    float4 RGBColor : COLOR0;  // Pixel color    
};


sampler2D tex0;
  
PS_OUTPUT pixelMain( float2 TexCoord : TEXCOORD0,
                     float4 Position : POSITION,
                     float4 Ambient  : COLOR0 ) 
{ 
  PS_OUTPUT Output;

  float4 col = tex2D( tex0, TexCoord );
  Output.RGBColor = Ambient * col;

  return Output;
}
#9
22:25, 27 дек. 2011

Ого почти джва года прошло :)

#10
10:37, 28 дек. 2011
Rip: Ого почти два года прошло

Лучше поздно, чем никогда.

Может у кого нибудь есть уже готовые исходники шейдеров для Irrlicht, только не из примеров - эти я уже до дыр затёр.
Поделитесь пожалуйста!

#11
7:33, 1 янв. 2012

MishanayCool
Вообще абсолютно всеравно под какой движок шейдер.

Вот недавно писал шейдер для травы, но думаю толку тебе с этого не будет (это только вершинный, до конца не дописан... ветер сейчас фигово эмулируется). Он поворачивает травинки к камере и наклоняет их по синусу.

float4x4 worldViewProj;
float time;
float3 eyeRotation;

struct INPUT
{
  float4 position: POSITION;
  float3 normal: NORMAL0;
  float2 texCoord: TEXCOORD0;
};

struct OUTPUT
{
  float4 position: POSITION;
  float2 texCoord: TEXCOORD0;
};

OUTPUT main(INPUT input)
{
  OUTPUT output;

  //bilboard transform
  input.position.xz -= input.normal.xz; //В нормале храниться центр травинки, у меня блок из 128 травинок со случайным положением

  float radius = length(input.position.xz);
  float currentAngle = 0;

  if(input.position.x < 0)
    currentAngle = 3.14159265f;

  if(radius > 0)
  {
    float sinValue;
    float cosValue;

    sincos(currentAngle - eyeRotation.y, sinValue, cosValue);

    //поворот точек травинки лицом к камере
    input.position.x = radius * cosValue;
    input.position.z = radius * sinValue;
  }

  input.position.xz += input.normal.xz;

  //Basic transform
  output.position = mul(input.position, worldViewProj);
  output.texCoord = input.texCoord;
  
  //wind transform
  if(input.texCoord.y > 0) //Во второй координате текстуры я храню "силу ветра" для текущей точки
  {
    time /= 1000.f;
    input.texCoord.y = 1.f - input.texCoord.y;
    output.position.x += 0.5f * sin(time + input.position.x * 0.05f) * rsqrt(input.texCoord.y * 0.5f * sin(input.texCoord.y)) * 0.1f;
  }
  
  return output;
}
IrrlichtФорум

Тема в архиве.