ГЛСЛ:включение/отключение текстурирования + шейдеров

StackOverflow https://stackoverflow.com/questions/884607

  •  23-08-2019
  •  | 
  •  

Вопрос

Я ищу способ доступа к состояниям OpenGL из шейдера.А Краткое справочное руководство GLSL, потрясающий ресурс, не смог мне помочь в этом вопросе.

В примере, над которым я работаю, у меня есть два следующих шейдера:

Вершина:

void    main()
{
    gl_FrontColor = gl_Color;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

Фрагмент:

uniform sampler2D   tex;
uniform float   flattening;

void main( void ) 
{
    vec4    texel;
    texel = texture2D(tex, gl_TexCoord[0].st);
    texel.r *= gl_Color.r;
    texel.g *= gl_Color.g;
    texel.b *= gl_Color.b;
    texel.a *= gl_Color.a;
    gl_FragColor = texel;
}

Когда я визуализирую многоугольники без текстуры, их значения альфа правильные, но им присваивается черный цвет.

1. Какую условную проверку я могу настроить, чтобы переменной «texel» было присвоено значение vec4(1.0, 1.0, 1.0, 1.0) вместо выборки из текстуры, когда GL_TEXTURE_2D выключен?

2. Будет ли обработка быстрее, если я напишу разные шейдеры для разных режимов текстурирования и переключаюсь между ними там, где буду использовать? glEnable/glDisable(GL_TEXTURE_2D)?

Это было полезно?

Решение

Извините, но вы не можете получить доступ к такому состоянию из GLSL, и точка.

Фактически, в будущем GLSL вам придется отправлять все формы/атрибуты самостоятельно, т.е.никаких автоматических gl_ModelViewMatrix, gl_LightPosition, gl_Normal и т.п.Будут доступны только базовые вещи, такие как gl_Position и gl_FragColor.

Это отменяет ваш второй вопрос, но вы всегда можете использовать #ifdef для включения/отключения частей вашего шейдера, если вы считаете, что это удобнее, чем писать отдельные шейдеры для разных режимов текстуры.

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

Другие советы

Один из методов, который я видел, — это привязка текстуры 1x1 к одному текселю (1,0, 1,0, 1,0, 1,0) при рендеринге нетекстурированных многоугольников.Переключатель текстур должен быть дешевле, чем переключатель шейдеров, а текстура 1x1 полностью поместится в кэш текстур.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top