OpenGL中为非独立着色器传递变量方法

在程序中为顶点着色器中的变量传递分为三种种,attribute变量、uniform变量、uniform块

1、attibute变量

        const char* vs  =   "attribute   vec3    _position;\n\
                            attribute   vec3    _color;\n\
                            varying     vec3    _outColor;\n\
                            void main()\n\
                            {\n\
                                _outColor   =   _color;\n\
                                gl_Position =   gl_ModelViewProjectionMatrix * vec4(_position,1.0);\n\
                            }";
        const char* ps  =   "uniform vec4 _color;\n\
                            varying     vec3    _outColor;\n\
                            void main()\n\
                            {\n\
                                gl_FragColor = vec4(_outColor,1);\n\
                            }";

对着色器中的_position、_color、_outColor三个变量传值:

求索引号

        _position   =   glGetAttribLocation(_program, "_position");
        _color      =   glGetAttribLocation(_program, "_color");

根据索引号赋值

       glEnableVertexAttribArray(_shader._position);
        glVertexAttribPointer(_shader._position,3,GL_FLOAT,GL_FALSE,sizeof(Vertex),rect);

        glEnableVertexAttribArray(_shader._color);
        glVertexAttribPointer(_shader._color,3,GL_UNSIGNED_BYTE,GL_TRUE,sizeof(Vertex),&rect[0].r);

2、uniform变量

                            struct MVP\n\
                            { \n\
                                mat4  _mat;\n\
                                float _scaler;\n\
                            };\n\
                            uniform MVP     _mvp;\n\

_mvp、与1中的_color都属于uniform变量

求索引号

        _mvp        =   glGetUniformLocation(_program,"_mvp._mat");

根据索引号赋值

        glUniform4f(_shader._ucolor,0,1,0,1);

3、uniform块

                            uniform MVP\n\
                            { \n\
                                mat4  _mat;\n\
                            }mvp;\n\

索引

        _mvp        =   glGetUniformBlockIndex(_program,"MVP");

为缓冲区赋值,并且放到编号为1的绑定点

        glBindBuffer(GL_UNIFORM_BUFFER,_ubo);
        glBufferSubData(GL_UNIFORM_BUFFER,0,sizeof(CELL::matrix4),prj.data());
        glBindBufferBase(GL_UNIFORM_BUFFER,1,_ubo);

从编号为1的绑定点处取数据

        glUniformBlockBinding(_shader._program,_shader._mvp,1);

猜你喜欢

转载自blog.csdn.net/qq_16334327/article/details/81586795
今日推荐