Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将代码从OpenGL 2.1转换为OpenGL 3.2_C++_Opengl_Shader_Opengl 3 - Fatal编程技术网

C++ 将代码从OpenGL 2.1转换为OpenGL 3.2

C++ 将代码从OpenGL 2.1转换为OpenGL 3.2,c++,opengl,shader,opengl-3,C++,Opengl,Shader,Opengl 3,我想了解这段旧代码,并使用着色器将其翻译为最新版本的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) {

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

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

在纹理不仅仅由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);
}

很抱歉,我没有复制另外两个字符串,现在添加,并且它具有主颜色如果channel==Alpha会发生什么?@SAKrisT:那么纹理的值会被传递。因为它是alpha纹理,所以很可能只用于调制混合因子。在GLSL中,它将是
gl_FragColor=vec4(primary_color.rgb,纹理(tex,tex_coord).a)。OpenGL固定函数管道状态机是一个复杂的庞然大物。请稍候,但点积返回的是float,而不是vec4。@SAKrisT:忘记前面的注释吧,我忘记了代码中的
vec4
构造函数。寄存器组合器行为是在所有通道上复制标量积(从技术上讲,您可以在RGB和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);
}