双源融混

来源:互联网 发布:java temp dir 编辑:程序博客网 时间:2024/06/06 09:21

所谓的双源融混就是片元的两个输出元,作用于同一个帧缓存。
GPU:

layout(location = 0, index = 0) out vec4 first_output;layout(location = 0, index = 1) out vec4 second_color;

CPU:

 CHECK_GL_ERROR();    glClear(GL_COLOR_BUFFER_BIT);    CHECK_GL_ERROR();    nv::matrix4f projection_matrix;    nv::perspective(projection_matrix, 3.14f * 0.25f, m_width/(float)m_height, 0.1f, 30.0f);    nv::matrix4f camera_matrix = projection_matrix * m_transformer->getModelViewMat();    CHECK_GL_ERROR();    //-------------------------    glDisable(GL_BLEND);   //--------------------------    mProgram->enable();    mProgram->setUniformMatrix4fv("uViewProjMatrix", camera_matrix._array, 1, GL_FALSE);    mProgram->setUniform4f("vColor", 0.7, 0.3, 0.4, 0.5);    CHECK_GL_ERROR();    NvDrawQuadGL(mProgram->getAttribLocation("aPosition"));    CHECK_GL_ERROR();    //----------------------    glEnable(GL_BLEND);    glBlendFunc(GL_ONE, GL_SRC1_COLOR);    //----------------------    nv::matrix4f offset_matrix;    offset_matrix.set_translate(nv::vec3f(1.0f,0.0f,0.0f));    camera_matrix = projection_matrix * offset_matrix*m_transformer->getModelViewMat();    mProgram->setUniform4f("vColor", 0.3, 0.7, 0.4, 0.5);    mProgram->setUniformMatrix4fv("uViewProjMatrix", camera_matrix._array, 1, GL_FALSE);    CHECK_GL_ERROR();    NvDrawQuadGL(mProgram->getAttribLocation("aPosition"));    CHECK_GL_ERROR();    mProgram->disable();

设置的效果:

RGBdst=RGBdstRGBsrc1+RGBsrc0

这里写图片描述

程序验证:
这里写图片描述

扩展技巧:

过uniform 变量的形式由应用程序传递给GPU的参数。只要设置一次,那么这个变量的值的状态就由这个程序对象进行维护。直到下一次更改为止。

比如设置一个颜色变量,只需要设置一次即可,不必要每次不更改都设置其值。

源码链接:
https://t.xiaomiquan.com/M7YFEqZ