Welcome, Guest. Please Login or Register
Linderdaum Engine
  Visit YaBB today Wink
  HomeHelpSearchLoginRegister  
 
Pages: 1 2 3 4 
Send Topic Print
Создание материала и простейшего шейдера (Read 2879 times)
ViktorL
YaBB Administrator
*****



Linderdaum - the engine
of the future

Posts: 84
Russia, SPb
Gender: male
Re: Создание материала и простейшего шейдера
Reply #30 - 27.04.2009 at 12:16:09
 
может, это баг в движковом коде, я просто не смотрел...
Back to top
 
WWW  
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #31 - 27.04.2009 at 15:31:45
 
может не сработало из-за того, что я вместо uniform float NumLights определил как uniform int NumLights Lips Sealed
Back to top
 
 
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #32 - 27.04.2009 at 23:35:55
 
переписал:
Code:
/*VERTEX_PROGRAM*/

#version 120

const int MaxLights = 8;

//varying vec3 EyePos;
varying vec2 TexCoord0;
varying vec3 ViewDir;
varying vec3 LightDir[MaxLights];
varying vec3 Normal;

uniform vec4 LightPosition[MaxLights]; // in camera space: premultiplied with ModelView
uniform vec4 LightColor[MaxLights];
uniform float NumLights;

void main(void)
{
gl_Position = ftransform();

TexCoord0 = vec2(gl_MultiTexCoord0);
Normal = gl_NormalMatrix * gl_Normal;
vec4 ObjectPosition = gl_ModelViewMatrix * gl_Vertex;
ViewDir = -(gl_ModelViewMatrix * gl_Vertex).xyz;

for (int i = 0; i != int(NumLights); ++i)
{
LightDir[i] = LightPosition[i].xyz - (gl_ModelViewMatrix * gl_Vertex).xyz;
}
}

/*FRAGMENT_PROGRAM*/

#version 120

const int MaxLights = 8;

uniform sampler2D Texture0; // Diffuse
uniform vec4 LightColor[MaxLights];
uniform float NumLights;


varying vec2 TexCoord0;
varying vec3 ViewDir;
varying vec3 LightDir[MaxLights];
varying vec3 Normal;

void main(void)
{
vec4 AmbientColor = vec4(0.5, 0.5, 0.5, 1.0);
float SpecularPower = float(20.0);

// vec3 nLightDir = normalize(LightDir[MaxLights]);

vec3 nLightDir = vec3(0.0, 0.0, 0.0);
for (int i = 0; i != NumLights; ++i )
{
nLightDir = normalize( LightDir[i] );
}

vec3 nNormal = normalize(Normal);
vec3 nViewDir = normalize(ViewDir);

vec4 DiffuseColor = texture2D(Texture0, TexCoord0);
// vec4 SpecularColor = vec4( DiffuseColor.a ) * LightColor[MaxLights];

vec4 SpecularColor = vec4(0.0, 0.0, 0.0, 0.0);
for (int i = 0; i != NumLights; ++i )
{
SpecularColor = vec4( DiffuseColor.a ) * LightColor[i];
}

vec4 CompleteAmbient = AmbientColor * DiffuseColor;

float NormalDotLight = 0.0;

for (int i = 0; i != NumLights; ++i )
{
NormalDotLight = dot( normalize( LightDir[i] ), nNormal );
}

vec4 CompleteDiffuse = DiffuseColor * NormalDotLight * DiffuseColor;

vec3 Reflection = normalize(2.0 * nNormal * NormalDotLight - nLightDir);

float ReflectionDotView = max(0.0, dot(Reflection, nViewDir));

vec4 CompleteSpecular = SpecularColor * pow(ReflectionDotView, SpecularPower);

gl_FragColor = CompleteAmbient + CompleteDiffuse + CompleteSpecular;
}

вылета из-за перебора нет, осталась просто ошибка  Source file: .\Src\Src.Core\GUI\GUIManager.cpp
Source line: 37, лог в атаче
Back to top
 

Engine_003.rar (4 KB | 28 )
 
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #33 - 28.04.2009 at 00:38:20
 
пересобрал с исходника 270409, удалил инициализацию версии 120, потому что ругался, и всеравно таже ошибка
Back to top
 

Engine_004.rar (4 KB | 32 )
 
IP Logged
 
Sergey Kosarevsky
YaBB Administrator
*****



Founding father

Posts: 92
Russia, SPb
Gender: male
Re: Создание материала и простейшего шейдера
Reply #34 - 28.04.2009 at 10:44:06
 
Ты запускал оригинальную версию, которую скачал, или же что-то менял?

Обнови, пожалуйста, драйвер для видеокарты  Smiley
Back to top
 
WWW  
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #35 - 29.04.2009 at 00:12:01
 
Драйвер обновил, ошибка та же.
Вы уже ОпенГЛ3 используете?
выход наверно один - вкуривать в ваш базовый шейдер, хотя там по-моему функций больше
Back to top
 
 
IP Logged
 
Sergey Kosarevsky
YaBB Administrator
*****



Founding father

Posts: 92
Russia, SPb
Gender: male
Re: Создание материала и простейшего шейдера
Reply #36 - 29.04.2009 at 00:53:39
 
Да, уже во всю OpenGL 3. Ещё с прошлого года.

Базовый шейдер сейчас довольно активно меняется, практически каждый день. До релиза ещё не раз "потрогаем".  Так что не заморачивайся пока. Если какие-то замечания мелкие есть, то отсылай сюда - учтём и вставим в шейдер.
Back to top
 
WWW  
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #37 - 29.04.2009 at 12:13:13
 
Хочу с освещением разобраться, чтоб вас по своим прихотям не дергать. С интеграцией шейдеров вроде как все ясно.

Вполне вероятно, что нарушен цикл вычисления дифуз и блика
If нахождение нормаи луча ИС
  if вычисление цвета ИС
    вычисление нормали, отражения, дифуз, спекуляр
сложить полученые данные по каждому ИС
вычисление окраски объекта

и поседний момент - это использование дефференд шейдинга, что категорически меняет дело и просчет шейдера+)
Back to top
« Last Edit: 29.04.2009 at 17:12:13 by Unter »  
 
IP Logged
 
Sergey Kosarevsky
YaBB Administrator
*****



Founding father

Posts: 92
Russia, SPb
Gender: male
Re: Создание материала и простейшего шейдера
Reply #38 - 29.04.2009 at 21:55:57
 
Дефферед шейдинг это следующий шаг. И он модель освещения не поменяет. По идее, какая разница что там в шейдере?
Back to top
 
WWW  
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #39 - 30.04.2009 at 23:12:31
 
поговорил с прогером у себя на работе и оказалось, что я прав.
поэтому ваш вариант шейдеров побыстрее будет+)

с дефферед шейдингом будет одна единственная проблема - прозрачность между объектами
Back to top
 
 
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #40 - 01.05.2009 at 02:05:59
 
почистил базовый шейдер:
Code:
/*VERTEX_PROGRAM*/

//
// all ligting is done in camera space
//

const int MaxLights = 8;

varying vec2 TexCoord0;
varying vec3 eyeNormal;
varying vec3 viewVec;
varying vec3 lightDir[MaxLights];

uniform float ENGINE_TIME;

// lights
uniform vec3 LightPosition[MaxLights];  // in camera space: premultiplied with ModelView
uniform vec4 LightColor[MaxLights];     // RGBA
uniform float NumLights;                // number of active lights

void main()
{
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

   TexCoord0 = vec2(gl_MultiTexCoord0);
   eyeNormal = gl_NormalMatrix * gl_Normal;
   viewVec = -(gl_ModelViewMatrix * gl_Vertex).xyz;

   // if no lights are used setup dummy directional light
   lightDir[0] = vec3( 0.408250, 0.408250, 0.8165 );

   for (int i = 0; i != int(NumLights); ++i)
   {
      lightDir[i] = LightPosition[i] - (gl_ModelViewMatrix * gl_Vertex).xyz;
   }
}

/*FRAGMENT_PROGRAM*/

//#define DISABLE_LIGHTS

const int MaxLights = 8;

varying vec2 TexCoord0;
varying vec3 eyeNormal;
varying vec3 viewVec;
varying vec3 lightDir[MaxLights];

uniform vec4 LightColor[MaxLights];
uniform vec3 Attenuation[MaxLights];
uniform float NumLights;
uniform sampler2D Texture0; // Diffuse

//varying float OPACITY

vec3 GetNormal()
{
   vec3 LNormal = normalize( eyeNormal );
   return LNormal;
}

float GetAttenuation(int LightN)
{
   float Dist = length( lightDir[LightN] );

   float Att  = 1.0 / dot( Attenuation[LightN], vec3( 1.0, Dist, Dist * Dist ) );

   return Att;
}

vec4 GetAmbient()
{
   vec4 AmbientColor = vec4(0.5, 0.5, 0.5, 1.0);

   vec4 Color = vec4 (AmbientColor);

   return Color;
}

vec4 GetDiffuse(vec3 Normal)
{
   vec4 Ambient = GetAmbient();

   // accumulators
   vec4  KdVec = vec4( 0.0, 0.0, 0.0, 0.0 );

   // accumulate diffuse light from all light sources
   for (int i = 0; i != NumLights; ++i )
   {
      float LdotN = dot( normalize( lightDir[i] ), Normal );

      vec4 Kd = vec4( max( LdotN, 0.0 ) );

      Kd *= LightColor[i];

      KdVec += Kd * GetAttenuation( i );
   }

   vec4 Color = texture2D(Texture0, TexCoord0);

   Color += vec4 (Color) ;

   return Color * (vec4(1.0)-Ambient) * KdVec + Ambient * Color;
}

vec4 GetSpecular(vec3 Normal)
{
//   vec4 Color = vec4( DiffuseColor.a );
  float Color = texture2D(Texture0, TexCoord0).a;
   
   Color *= float (Color) ;


   vec4  Ks = vec4( 0.0, 0.0, 0.0, 0.0 );

   // accumulate diffuse light from all light sources
   for (int i = 0; i != NumLights; ++i )
   {
      vec3 R = reflect( -lightDir[i], Normal );

      float RdotE = max( dot( normalize(R), normalize(viewVec) ), 0.0  );

      Ks += RdotE * LightColor[i] * GetAttenuation( i );
   }

   return Color * pow( clamp( Ks, 0.0, 1.0 ), vec4(32.0) );
}

void main()
{
   vec3 EN = GetNormal();

   vec4 Diffuse  = GetDiffuse( EN );
   vec4 Specular = GetSpecular( EN );

   vec4 FinalColor = Diffuse + Specular;

   gl_FragColor = FinalColor;
}

и получил
Back to top
 

SSSpecInAlpha.jpg (107 KB | 38 )
SSSpecInAlpha.jpg
 
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #41 - 01.05.2009 at 22:26:19
 
с освещение разобрался - расположение ИС в сцене было по нулям координат
а вот размер блика найти не могу
Code:
/*VERTEX_PROGRAM*/

//
// all ligting is done in camera space
//

const int MaxLights = 8;

varying vec2 TexCoord0;
varying vec3 eyeNormal;
varying vec3 viewVec;
varying vec3 lightDir[MaxLights];

uniform float ENGINE_TIME;

// lights
uniform vec3 LightPosition[MaxLights]; // in camera space: premultiplied with ModelView
uniform vec4 LightColor[MaxLights]; // RGBA
uniform float NumLights; // number of active lights

void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

TexCoord0 = vec2(gl_MultiTexCoord0);
eyeNormal = gl_NormalMatrix * gl_Normal;
viewVec = -(gl_ModelViewMatrix * gl_Vertex).xyz;

// if no lights are used setup dummy directional light
lightDir[0] = vec3( 0.408250, 0.408250, 0.8165 );

for (int i = 0; i != int(NumLights); ++i)
{
lightDir[i] = LightPosition[i] - (gl_ModelViewMatrix * gl_Vertex).xyz;
}
}

/*FRAGMENT_PROGRAM*/

//#define DISABLE_LIGHTS

const int MaxLights = 8;

varying vec2 TexCoord0;
varying vec3 eyeNormal;
varying vec3 viewVec;
varying vec3 lightDir[MaxLights];

uniform vec4 LightColor[MaxLights];
uniform float NumLights;
uniform sampler2D Texture0; // Diffuse

vec4 GetDiffMap()
{
vec4 Color = texture2D(Texture0, TexCoord0);
return Color;
}

vec3 GetNormal()
{
vec3 LNormal = normalize( eyeNormal );
return LNormal;
}

vec4 GetAmbient()
{
vec4 Color = vec4(0.2, 0.2, 0.2, 1.0);
return Color;
}

vec4 GetDiffuse(vec3 Normal)
{
vec4 Ambient = GetAmbient();
vec4 DiffMap = GetDiffMap();

// accumulators
vec4 SumDiffVec = vec4( 0.0, 0.0, 0.0, 0.0 );

// accumulate diffuse light from all light sources
for (int i = 0; i != NumLights; ++i )
{
float LdotN = dot( normalize( lightDir[i] ), Normal );

vec4 SumLight = vec4( max( LdotN, 0.0 ) );

SumLight *= LightColor[i];

SumDiffVec += SumLight;
}

DiffMap += vec4 (DiffMap) ;

vec4 Color = DiffMap * (vec4(1.0)-Ambient) * SumDiffVec + Ambient * DiffMap;

return Color;

}

vec4 GetSpecular(vec3 Normal)
{
vec4 DiffMap = GetDiffMap();
float Color = vec4(DiffMap).a;
Color *= float (Color);

vec4 SumSpec = vec4( 0.0, 0.0, 0.0, 0.0 );

// accumulate diffuse light from all light sources
for (int i = 0; i != NumLights; ++i )
{
vec3 R = reflect( -lightDir[i], Normal );

float RdotE = max( dot( normalize(R), normalize(viewVec) ), 0.0 );

SumSpec += RdotE * LightColor[i];
}

return Color * pow( clamp( SumSpec, 0.0, 0.05 ), vec4(32.0) );
}

void main()
{
vec3 EN = GetNormal();

vec4 Diffuse = GetDiffuse( EN );
vec4 Specular = GetSpecular( EN );

vec4 FinalColor = Diffuse + Specular ;

gl_FragColor = FinalColor;
}

/*
* 21/04/2009
Light sources
* 20/04/2009
Uniforms for ambient, diffuse and specular
*/

Back to top
 

SSSpecInAlpha2.jpg (76 KB | 32 )
SSSpecInAlpha2.jpg
 
IP Logged
 
Unter
Global Moderator
*****



UnterGrad

Posts: 242
Gender: male
Re: Создание материала и простейшего шейдера
Reply #42 - 17.02.2010 at 14:56:52
 
есть предложение на ближайшее будущее все-таки сделать альтернативный Анрыловскому редактор шейдеров для ОпенГЛ

в аттаче пример сорцев анриловского нормалмап шейдера
Back to top
 

 
IP Logged
 
Sergey Kosarevsky
YaBB Administrator
*****



Founding father

Posts: 92
Russia, SPb
Gender: male
Re: Создание материала и простейшего шейдера
Reply #43 - 01.03.2010 at 20:11:59
 
Надо сделать простой на С#, в комплекте с мешлоадером
Back to top
 
WWW  
IP Logged
 
ViktorL
YaBB Administrator
*****



Linderdaum - the engine
of the future

Posts: 84
Russia, SPb
Gender: male
Re: Создание материала и простейшего шейдера
Reply #44 - 15.03.2010 at 22:07:55
 
Quote:
Надо сделать простой на С#, в комплекте с мешлоадером


Сделан он. СДЕЛАН !
Back to top
 
WWW  
IP Logged
 
Pages: 1 2 3 4 
Send Topic Print