конвейер с фиксированной функцией openGL - масштабировать интенсивность текстуры выше 1,0 - PullRequest
0 голосов
/ 12 февраля 2011

Есть ли другой способ, кроме мультитекстурирования или многопроходного рендеринга, для масштабирования интенсивности текстуры выше фактора 1,0 с использованием конвейера с фиксированной функцией?например, коэффициент 1.5 может быть достигнут путем рендеринга текстуры с полной интенсивностью один раз, а затем с цветом (0,5,0,5,0,5,1,0) во второй раз с использованием аддитивного смешения.с одним проходом и без мультитекстурирования?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2011

Вы можете использовать свойства GL_RGB_SCALE и GL_ALPHA_SCALE текстурной среды, чтобы применить масштабный коэффициент 2х или 4х, но для этого необходимо использовать режим текстурной среды GL_COMBINE вместо предопределенных режимов. Чтобы получить коэффициент масштабирования 1,5, вы должны установить GL_RGB_SCALE на 2,0 и установить цвет {0,75, 0,75, 0,75, 1,0}. Обратите внимание, что текстурная среда для каждого текстурного блока все еще ограничивается [0, 1], поэтому, если вам нужен этот тип масштабирования, вы должны применить масштабирование к последнему текстурному блоку, чтобы избежать какого-либо отсечения.

0 голосов
/ 12 февраля 2011

Я предполагаю, что вы используете либо библиотеку OpenGL 3.0, либо OpenGL ES. Я думаю, что вы могли бы сделать что-то подобное, хотя я не уверен, насколько это поддерживается.

Это должно быть немного больше, чем мой первоначальный ответ, но вы застряли с использованием 1,5 в качестве значения модуляции.

// Setup...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex1);

// Combine: Result.rgb = Texture + Texture - 0.5
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

// Combine: Result.a = Texture
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);

Если вы можете сделать это с помощью шейдеров, вам будет гораздо лучше:

//Fragment shader
uniform sampler2D texture;
uniform float blend;
varying vec2 texcoord;
void main()
{
   vec4 texel0 = texture2D(texture, texcoord);
   texel0 *= blend;
   gl_FragColor = texel;
}
...