颜色、像素、帧缓存

来源:互联网 发布:https seo 编辑:程序博客网 时间:2024/05/16 18:23

缓存

    1)颜色缓存:多重采样技术,动画中采用了双重缓冲技术

       深度缓存:每个像素保留一个深度值,可以用来判断3维空间中物体的可见性 

       模板缓存:限制屏幕特定区域的绘制

    2)缓存掩码:glDepthMask(GL_TRUE)则深度缓存可以写入, 此操作在将数据写入颜色、深度或者模板缓存区之前。



设置顶点的颜色和位置

  void  Initialize( )

    glGenVertexArrays( NumVAOs, VAOs );
    glBindVertexArray( VAOs[Triangles] );
 
    struct VertexData {
        GLubyte color[4];
        GLfloat position[4];
    }; 

    VertexData vertices[NumVertices] = {
        {{ 255,   0,   0, 255 }, { -0.90f, -0.90f }},  // Triangle 1
        {{   0, 255,   0, 255 }, {  0.85f, -0.90f }},
        {{   0,   0, 255, 255 }, { -0.90f,  0.85f }},
        {{  10,  10,  10, 255 }, {  0.90f, -0.85f }},  // Triangle 2
        {{ 100, 100, 100, 255 }, {  0.90f,  0.90f }},
        {{ 255, 255, 255, 255 }, { -0.85f,  0.90f }}
    }; 

    glGenBuffers( NumBuffers, Buffers );
    glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );
    glBufferData( GL_ARRAY_BUFFER, sizeof(vertices),  vertices, GL_STATIC_DRAW ); 

    ShaderInfo  shaders[] = {
        { GL_VERTEX_SHADER, "media/shaders/gouraud/gouraud.vert" },
        { GL_FRAGMENT_SHADER, "media/shaders/gouraud/gouraud.frag" },
        { GL_NONE, NULL }
    }; 


    GLuint program = LoadShaders( shaders );
    glUseProgram( program ); 

    glVertexAttribPointer( vColor, 4, GL_UNSIGNED_BYTE,   GL_TRUE, sizeof(VertexData), BUFFER_OFFSET(0) );
    glVertexAttribPointer( vPosition, 2, GL_FLOAT,   GL_FALSE, sizeof(VertexData),  BUFFER_OFFSET(sizeof(vertices[0].color)) ); 

    glEnableVertexAttribArray( vColor );
    glEnableVertexAttribArray( vPosition );
}

 

多重采样

   glEnable(GL_MULTISAMPLE)      //只是对几何图元边缘的平滑技术

     1)      glGetIntegerv()       来查询多重采样的缓存,以判断是否请求成功

              glGetMultisamplefv()         查询样本位置信息

      2)在片元着色器中用sample in vec4 color;来声明

             如果不能用sample关键字来修改片元着色器,通过使用采样着色的方式

                     glEnable(GL_SAMPLE_SHADING)

                     glMinSampleShading(0.5)           //设置最小采样着色的比率



片元测试

   剪切测试:  glEnable(GL_SCISSOR_TEST)                glScissor(x, y, width, height)

   多重采样:  glEnable(GL_SAMPLE_COVERAGE)      glSampleCoverage()

   模板测试:  glEnable(GL_STANCIL_TEST)        glStencilFunc()     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP)  //没通过

   深度测试:  glEnable(GL_DEPTH_TEST)           glDepthFunc(GL_NEVER)       //GL_LESS

   融混测试:  glEnable(GL_BLEDN)                    glBlendFunc()      glBlendFuncSeparate()

    抖动:      glEnable(GL_DITHER)                                    提升颜色的分辨率

    逻辑:      glEnable(GL_COLOR_LOGIC_OP)         glLogicOp(GL_COPY)


   注意:深度测试一般会涉及到多边形偏移问题,可设置多边形光栅化方式。



遮挡查询

   在深度测试之后,用来判断一系列复杂的集合物体的可见性,它不需要渲染全部的几何信息,而是先渲染它的包围体,这样降低了渲染资源的消耗

          glGenQueries(1, &v);                        

          glBeginQueries(GL_SAMPLES_PASSED, Query);

                 glDrawArrays();

         glEndQuery(GL_SAMPLES_PASSED);

         glGetQueryObjectiv();                   //获取查询结果

              ...

          glBeginConditionalRender();      //条件渲染,用来判断遮挡查询是否得到了有效的片元

                glDrawArrays()

         gnEndConditionalRender()

                    

 

图元反走样(抗锯齿)

    glEnable(GL_LINE_SMOOTH)      

      glHint(GL_LINE_SOOTH_HINT,GL_FASTEST);  线段的反走样

                  GL_POLYGON_SMOOTH_HINT                                    GL_NICEST

                  GL_TEXTURE_COMPRESSION_HINT                            GL_DONT_CARE

                  GL_FRAGMENT_SHADER_DERIVATIVE_HINT

       仅仅简述,自己查找

 


帧缓存、渲染缓存

      帧缓存将数据的拷贝消耗最小化,同时对性能进行优化。

     渲染缓存中的数据只有关联到一个帧缓存对象之后才有意义,用于存储格式化的图像数据,缓存的格式和要求渲染的格式必须同

       glGenRenderbuffers()           //先创建渲染缓存对象

      glBindRenderbuffer()

      glRenderbufferStorage() 

               glGenFramebuffers()      //再创建帧缓存对象

              glBindFramebuffers() 

     glFramebufferRenderbuffer()       //绑定



0 0
原创粉丝点击