Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Проблема с шейдером
#1
Попытался написать шейдер освещения на 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);
}
Ответ
#2
light_pos нужно трансформировать в видовое пространство. Правильный шейдер будет выглядеть так:

Код:
[== c++ ==]
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();
}

Код:
[== c++ ==]
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);
}

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

Код:
[== c++ ==]
paramViewMatrix = GLSLShaderCreateParameter(shader, 'viewMatrix');
GLSLShaderSetParameterViewMatrix(paramViewMatrix);
Ответ
#3
Спасибо за ответ. Но текстура почему то не отображается. Поверхность просто белого цвета
Ответ
#4
Текстуру надо тоже передавать в шейдер и сэмплировать функцией texture2D, читай внимательнее справку:

Код:
[== c++ ==]
uniform sampler2D diffuseTexture;

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

Код:
[== c++ ==]
paramDiffuseTexture = GLSLShaderCreateParameter(shader, 'diffuseTexture');
GLSLShaderSetParameterTexture(paramDiffuseTexture, '', 0);
Ответ
#5
Дарова всем ) Cool
BANEBYTE , над чем работаешь ? Smile
Gecko , будут ли новости по обновам и дай ссылку на свой проект D .
..//((( 
(((•.•)))            [ins] YOU TUBE [/ins]                இ}~ڿڰۣ-ڰۣ~—
..◢█◣
_./..I
Ответ
#6
Работаю над редактором для 3д игры. Но сейчас забросил, так как пишу свой двиг с нуля на OpenGL
Ответ
#7
BANEBYTE Написал:Работаю над редактором для 3д игры. Но сейчас забросил, так как пишу свой двиг с нуля на OpenGL
Круто Бро удачи , ссылку или группу на инфу о своем двиге дропни )
..//((( 
(((•.•)))            [ins] YOU TUBE [/ins]                இ}~ڿڰۣ-ڰۣ~—
..◢█◣
_./..I
Ответ
#8
van88268 Написал:Gecko , будут ли новости по обновам и дай ссылку на свой проект D .

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

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

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


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)