【问题标题】:transform code from OpenGL 2.1 to OpenGL 3.2将代码从 OpenGL 2.1 转换为 OpenGL 3.2
【发布时间】:2013-11-15 17:08:55
【问题描述】:

我想了解这段旧代码并使用着色器将其转换为最新版本的 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

【问题讨论】:

    标签: c++ opengl shader opengl-3


    【解决方案1】:

    它设置了一个法线贴图纹理。通道开关定义“法线”矢量指向哪个轴并相应地设置颜色;今天你会穿上制服。

    在纹理不只包含 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);
    }
    

    【讨论】:

    • 对不起,我没有再复制2个字符串,现在添加它,它有原色
    • 如果 channel == Alpha 会发生什么?
    • @SAKrisT:然后传递纹理的值。由于它是一个 alpha 纹理,它很可能只用于调制混合因子。在 GLSL 中,它将是 gl_FragColor = vec4(primary_color.rgb, texture(tex, tex_coord).a);。 OpenGL 固定功能管道状态机是一个令人费解的野兽。
    • 等一下,但点积返回浮点数,而不是 vec4。
    • @SAKrisT:忘记之前的评论,我忘记了代码中的vec4 构造函数。寄存器组合器的行为是在所有通道上复制标量积(从技术上讲,您可以将其拆分为 RGB 和 Alpha 通道)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2018-09-14
    相关资源
    最近更新 更多