所谓的双源融混就是片元的两个输出元,作用于同一个帧缓存。
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的参数。只要设置一次,那么这个变量的值的状态就由这个程序对象进行维护。直到下一次更改为止。
比如设置一个颜色变量,只需要设置一次即可,不必要每次不更改都设置其值。