#1 2020-01-12 14:41:49

BANEBYTE
Участник
Зарегистрирован: 2020-01-03
Сообщений: 20

Проблема с шейдером

Попытался написать шейдер освещения на GLSL. Сделал все как по инструкции, но почему-то на выходе получаю сплошной черный цвет.
Вот код

Вертексный шейдер

varying vec3 normal;
varying vec3 position;

void main() {
	normal = gl_NormalMatrix * gl_Normal;
	position = (gl_ModelViewMatrix * gl_Vertex).xyz;
	gl_Position = ftransform();
}

Пиксельный шейдер

varying vec3 normal;
varying vec3 position;

vec3 light_pos;

void main() {
	light_pos = vec3(0.0, 10.0, 0.0);
	vec3 N = normalize(normal);
	vec3 LN = normalize(light_pos - position);
	float L = max(dot(N, LN), 0.0);
	vec3 color = gl_FrontMaterial.diffuse * L;
	gl_FragColor = vec4(color, 1.0);
}

Редактировался BANEBYTE (2020-01-12 14:42:13)

Offline

#2 2020-01-15 18:54:07

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Проблема с шейдером

light_pos нужно трансформировать в видовое пространство. Правильный шейдер будет выглядеть так:

varying vec3 normal; 
varying vec3 position; 
varying vec3 light; 
uniform mat4 viewMatrix;

const vec4 light_pos = vec4(0.0, 10.0, 0.0, 1.0);

void main() 
{ 
    normal = gl_NormalMatrix * gl_Normal; 
    position = (gl_ModelViewMatrix * gl_Vertex).xyz;
    light = (viewMatrix * light_pos).xyz;
    gl_Position = ftransform(); 
} 
varying vec3 normal;
varying vec3 position;
varying vec3 light; 

void main()
{
    vec3 N = normalize(normal);
    vec3 LN = normalize(light - position);
    float L = max(dot(N, LN), 0.0);
    vec3 color = gl_FrontMaterial.diffuse * L;
    gl_FragColor = vec4(color, 1.0);
}

Соответственно, надо также передать в шейдер видовую матрицу:

paramViewMatrix = GLSLShaderCreateParameter(shader, 'viewMatrix');
GLSLShaderSetParameterViewMatrix(paramViewMatrix);

Offline

#3 2020-01-15 20:34:33

BANEBYTE
Участник
Зарегистрирован: 2020-01-03
Сообщений: 20

Re: Проблема с шейдером

Спасибо за ответ. Но текстура почему то не отображается. Поверхность просто белого цвета

Offline

#4 2020-01-18 11:12:59

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Проблема с шейдером

Текстуру надо тоже передавать в шейдер и сэмплировать функцией texture2D, читай внимательнее справку:

uniform sampler2D diffuseTexture; 

void main() 
{ 
    // ...
    vec4 texColor = texture2D(diffuseTexture, gl_TexCoord[0].xy); 
    gl_FragColor = vec4(color * texColor.rgb, texColor.a); 
}
paramDiffuseTexture = GLSLShaderCreateParameter(shader, 'diffuseTexture'); 
GLSLShaderSetParameterTexture(paramDiffuseTexture, '', 0);

Offline

#5 2020-02-02 16:17:09

van88268
Участник
Зарегистрирован: 2018-06-05
Сообщений: 87
Сайт

Re: Проблема с шейдером

Дарова всем ) cool
BANEBYTE , над чем работаешь ? smile
Gecko , будут ли новости по обновам и дай ссылку на свой проект D .

Редактировался van88268 (2020-02-02 16:17:28)


..//((( 
(((•.•)))              YOU TUBE                  இ}~ڿڰۣ-ڰۣ~—
..◢█◣
_./..I

Offline

#6 2020-02-03 16:48:23

BANEBYTE
Участник
Зарегистрирован: 2020-01-03
Сообщений: 20

Re: Проблема с шейдером

Работаю над редактором для 3д игры. Но сейчас забросил, так как пишу свой двиг с нуля на OpenGL

Offline

#7 2020-02-09 20:14:07

van88268
Участник
Зарегистрирован: 2018-06-05
Сообщений: 87
Сайт

Re: Проблема с шейдером

BANEBYTE пишет:

Работаю над редактором для 3д игры. Но сейчас забросил, так как пишу свой двиг с нуля на OpenGL

Круто Бро удачи ,  ссылку или группу на инфу о своем двиге дропни )


..//((( 
(((•.•)))              YOU TUBE                  இ}~ڿڰۣ-ڰۣ~—
..◢█◣
_./..I

Offline

#8 2020-02-22 15:32:17

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Проблема с шейдером

van88268 пишет:

Gecko , будут ли новости по обновам и дай ссылку на свой проект D .

Пока трудно сказать, когда у меня будет время вернуться к разработке, но вроде FireRun работает над версией 3.9, так что все возможно.

Я сейчас пишу свой движок, Dagon, на OpenGL 4: https://github.com/gecko0307/dagon, скоро как раз планирую выпустить очередную версию.

Также смотрю в сторону WebGPU - мне кажется, он имеет все шансы стать стандартным графическим API в будущем, вытеснив OpenGL, причем не только в вебе, но и в нативных приложениях. На каком-то этапе не исключено, что перейду на него, у меня уже есть его привязка для D.

Offline

Подвал доски

Под управлением FluxBB