将代码从 OpenGL 2.1 转换为 OpenGL 3.2

transform code from OpenGL 2.1 to OpenGL 3.2

本文关键字:OpenGL 转换 代码      更新时间:2023-10-16

我想理解这个旧代码,并使用着色器将其翻译为最新版本的OpenGL:

        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

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

纹理环境

方程的纹理环境,因为纹理不仅仅由 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);
}