GLSL: включение / отключение текстурирования + шейдеры - PullRequest
3 голосов
/ 19 мая 2009

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

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

Vertex:

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)?

Ответы [ 2 ]

8 голосов
/ 19 мая 2009

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

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

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

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

3 голосов
/ 03 февраля 2012

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

...