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