2013-11-15 2 views
2

Я хочу понять этот старый код и перевести его на новую версию OpenGL с использованием шейдеров:преобразования кода с OpenGL 2.1 для OpenGL 3.2

 if (channel == Alpha) { 
      glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
     } else { 
      // replicate color into alpha 
      if (GL_ARB_texture_env_dot3) { 
       switch (channel) { 
       case Red: 
        glColor3f(1.0, 0.5, 0.5); 
        break;     
       case Green: 
        glColor3f(0.5, 1.0, 0.5); 
        break; 
       case Blue: 
        glColor3f(0.5, 0.5, 1.0); 
        break; 
       default: 
        // should not happen! 
        assert(0); 
       } 
      } else { 
       // should not happen! 
       assert(0); 
      } 

      glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); 
      glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_DOT3_RGBA_ARB); 
      glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); 
      glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); 
      glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PRIMARY_COLOR); 
      glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR); 
     } 
     <draw models> 

Мои идеи Что происходит:

if channe = Alpha 
    just replace alpha 
else 
    // no idea why used glColor3f 
    looks like it makes one of the colors 100% bright 
    and then in magical 6 glTexEnvi lines it transforms to alpha 

ответ

3

It установите нормальную текстуру отображения. Переключатель канала определяет, на какую ось указывает «нормальный» вектор, и соответственно устанавливает цвет; сегодня вы бы использовали форму для этого.

Уравнение текстуры среды для случая, что текстура не состоит из всего лишь альфа-канала устанавливает что-то, что выглядит следующим образом пиксельный шейдер

uniform vec3 primary_direction; // instead of primary color 
uniform sampler… tex; 

in vec2 tex_coord; 

void main() 
{ 
    gl_FragColor = vec4(dot(primary_direction, texture(tex, tex_coord)), 1); 
} 
+0

жаль, что я не скопировал еще 2 строки, теперь add и имеет основной цвет – SAKrisT

+0

Что происходит, если канал == Alpha? – SAKrisT

+1

@SAKrisT: Затем передаются значения текстуры. Поскольку это альфа-текстура, скорее всего, он будет использоваться для модуляции коэффициента смешивания. В GLSL это будет 'gl_FragColor = vec4 (primary_color.rgb, texture (tex, tex_coord) .a);'. Конечный автомат конвейера с фиксированной функцией OpenGL представляет собой запутанный зверь. – datenwolf

Смежные вопросы