2013-11-15 76 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

它设置了一个正常的映射纹理。通道开关定义“正常”向量指向哪个轴并相应地设置颜色;今天你会为此使用制服。

公式为纹理不包括仅仅是一个alpha通道的情况下,纹理环境设置的东西,看起来像下面的片段着色器

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个串,现在添加,它有原色 – SAKrisT

+0

如果频道==阿尔法发生了什么? – SAKrisT

+1

@SAKrisT:然后纹理的值被传递。由于它是一个alpha纹理,它很可能只是用于调整混合因子。在GLSL中,它将是'gl_FragColor = vec4(primary_color.rgb,texture(tex,tex_coord).a);'。 OpenGL固定功能流水线状态机是一个令人费解的野兽。 – datenwolf