Как выглядят стандартные шейдеры GLSL?для версии 330 - PullRequest
24 голосов
/ 26 декабря 2011

Как выглядят вершинные, фрагментные и геометрические шейдеры GLSL по умолчанию для версии # 330?

Я буду использовать #version 330 GLSL версии 3.30 NVIDIA через Cg-компилятор, потому что это то, что поддерживает моя видеокарта.

Под шейдерами по умолчанию я имею в виду шейдеры, которые делают то же самое, что и графическая карта, когда программа шейдеров выключена.

Я не могу найти хороший пример для #version 330. Погуглил весь день. Не уверен, что термин шейдер по умолчанию называется чем-то другим, вроде тривиального или базового, и поэтому я не могу его найти.

Любые рекомендации для книги с версией 330 или ссылки на простое учебное пособие для начинающих с версией 330 были бы также хороши.

пример тривиального вершинного шейдера в #version 110, выполняет преобразование вершин по умолчанию

#version 110

void main()
{
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}

пример тривиального фрагментного шейдера в #version 110, превращает цвет в красный

#version 110

void main()
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

1 Ответ

35 голосов
/ 30 декабря 2011

В OpenGL нет шейдеров по умолчанию. Похоже на то, что вам нужен очень простой пример шейдера, который преобразует вершины в пространство клипа и дает им цвет, так что вы идете:

Вершинный шейдер:

#version 330

layout(location = 0)in vec4 vert;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main()
{
    gl_Position = projection * view * model * vert;
}

Фрагмент шейдера:

#version 330

out vec4 fragColor;

void main()
{
    fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

В базовом профиле OpenGL 3.3 отсутствует поддержка многих старых вещей с фиксированными функциями, таких как стек матриц. От вас ожидается обработка ваших собственных матриц и отправка их вашим шейдерам. Здесь нет ftransform, и gl_Position является практически единственной допустимой переменной gl_ *.

Хотя glBindAttribLocation не считается устаревшим, предпочтительным методом определения местоположения атрибутов вершины является использование «layout (location = x)» в GLSL.

В вершинном шейдере «attribute» теперь «in», а «varing» теперь «out». В фрагментном шейдере «varing» теперь «in», а «gl_FragColor» определяется переменной «out». Я считаю, что gl_FragColor все еще действует, но теперь можно использовать переменную out для определения цвета.

Этот урок очень хорош и учит основам OpenGL и GLSL 3.30, я бы порекомендовал вам использовать его, чтобы больше узнать о GLSL. Также помните, что Справочные страницы GLSL - ваш друг.

...