双源融混

所谓的双源融混就是片元的两个输出元,作用于同一个帧缓存。
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在matlab中实现Dijkstra算法的双源版本,可以通过以下步骤实现: 1. 定义一个函数,输入参数为邻接矩阵、起点集合和终点集合,输出参数为起点到终点的最短路径和距离。 2. 在函数内部,首先对起点集合中的每个起点分别运行Dijkstra算法,得到起点到所有节点的最短路径和距离。 3. 然后对终点集合中的每个终点分别运行Dijkstra算法,得到所有节点到终点的最短路径和距离。 4. 最后,遍历所有节点,计算起点到终点的最短路径和距离,并返回结果。 下面是一个简单的实现示例: ```matlab function [path, dist] = dijkstra_double_source(adj_matrix, start_nodes, end_nodes) % adj_matrix: 邻接矩阵 % start_nodes: 起点集合 % end_nodes: 终点集合 % path: 起点到终点的最短路径 % dist: 起点到终点的最短距离 n = size(adj_matrix, 1); dist_start = inf(n, 1); dist_end = inf(n, 1); for i = 1:length(start_nodes) start_node = start_nodes(i); dist_start(start_node) = 0; visited = false(n, 1); for j = 1:n [~, u] = min(dist_start .* ~visited); visited(u) = true; for v = 1:n if adj_matrix(u, v) > 0 && ~visited(v) alt = dist_start(u) + adj_matrix(u, v); if alt < dist_start(v) dist_start(v) = alt; end end end end end for i = 1:length(end_nodes) end_node = end_nodes(i); dist_end(end_node) = 0; visited = false(n, 1); for j = 1:n [~, u] = min(dist_end .* ~visited); visited(u) = true; for v = 1:n if adj_matrix(v, u) > 0 && ~visited(v) alt = dist_end(u) + adj_matrix(v, u); if alt < dist_end(v) dist_end(v) = alt; end end end end end dist = inf; for i = 1:n for j = 1:n if i ~= j && dist_start(i) ~= inf && dist_end(j) ~= inf && adj_matrix(i, j) > 0 alt = dist_start(i) + adj_matrix(i, j) + dist_end(j); if alt < dist dist = alt; path = [i, j]; end end end end if dist == inf path = []; end end ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值