自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(125)
  • 资源 (6)
  • 收藏
  • 关注

原创 GPU渲染管线之旅|08 Pixel Shader

在这一部分中,我将处理像素处理的前半部分:dispatch和实际的像素着色。事实上,这是大多数图形程序员在谈到PS stage时想到的. 我们将在下一部分中谈到的alpha blend和Late-Z。在硬件上,情况有点复杂,我们之后会看到——这也是我将像素处理分成两部分的原因。在我们进入这个阶段的时候,阴影的像素坐标(实际上是四边形),加上相关的覆盖遮罩,从光栅化器/早期z单元到达——三角形的顺序与应用程序提交的完全相同,正如我上次指出的那样。我们在这里需要做的是将线性的,连续的工作流输出到数百个着色器单元

2021-06-18 09:10:37 1305 1

原创 GPU渲染管线之旅|07 深度处理、模板处理

在这一篇中,我们来讨论Z-pipline的前端部分(简称它为early-Z), 以及它是在光栅化中怎么起作用的。和上一篇一样,本篇也不会按实际的管道顺序进行讨论;我将首先描述基础算法,然后再补充管线中的各个阶段(以相反的顺序可以更简单的解释这些内容)。1.插值Z通过三角形进行插值,因为三角形顶点的属性是由vertex shader输出的。 让我先花点时间解释一下它是如何工作的。 在这一点上,我最初有一节介绍如何推导插值背后的数学运算,以及为何透视插值以这种方式起作用。 我花了几个小时苦苦挣扎,因为我试图

2021-03-17 22:01:35 451

原创 GPU渲染管线之旅|06 三角形的生成和建立

系列文章原发布在自己搭建的博客上:https://binean.top/欢迎回来。这次我们去看看三角形的光栅化。但在光栅化三角形之前,我们需要执行三角形设置,并且在设置三角形之前,我还要解释一下我们做的准备是为了什么,最后我们来聊聊三角形硬件光栅化算法。1.如何画一个三角形首先,给很熟悉这部分并自己写过软纹理映射的人一点小提示:三角形光栅器一次要处理一堆东西:跟踪三角形的形状,插值出坐标uuu和vvv(对于透视矫正映射,是u/zu/zu/z,v/zv/zv/z和1/z1/z1/z),执行Z缓冲测试.

2020-07-18 10:14:39 850

原创 GPU渲染管线之旅|05 图元处理、Clip/Cull, 投影和视图变换

系列文章原发布在自己搭建的博客上:https://binean.top/上一篇中我们讨论了关于“纹理和采样”,这一篇我们回到3D管线的前端。在执行完顶点着色之后,就可以实际的渲染东西了,对吗?暂时还不行, 因为在我们实际开始光栅化图元之前,仍然还有很多事要做。所以在本篇里我们不会看到任何光栅化内容——还得等到下次再讲。1. 图元装载当我们离开顶点处理流水线时,从着色器单元中得到了一个包含已经着色完成的顶点数据内存块,该内存块中包含一些完整的图元。我们不会让三角形,直线或者补块(pathces)之类.

2020-07-06 20:07:16 1256 2

原创 GPU渲染管线之旅|04 纹理和采样

上一篇讨论了顶点着色器,涵盖了GPU通用着色器处理单元的一些内容。它们都仅仅是向量处理单元, 但是当我们在访问Resource的时候,通常都不是这种向量的形式,所以GPU中还需要另一个专门用来在Pipeline中处理整数的单元:Texture Sampler. 这个单元内部相对比较复杂,复杂(也很有趣)到我们需要用单独的一篇文章来讨论它们。1.纹理阶段在我们开始了解真正的纹理操作之前,让我们先对API阶段的纹理操作有个完整的认识。在D3D11中,这主要由三个部分组成:采样阶段。设置滤波模式,设置寻址

2020-07-05 14:18:00 1507

原创 GPU渲染管线之旅|03 图形管线概览及GPU中顶点处理

通过前面几篇的内容,我们知道,应用程序中的Draw API调用会经过D3D Runtime, 用户态驱动等等各个层级,最终将命令传到GPU的命令解释器,GPU就会根据命令的内容来进行图形的计算和处理。那么这一篇我们就来看看顶点的处理流程。1. 开胃菜在介绍GPU的顶点处理之前,我们先看看3D渲染管线。3D渲染管线是由一系列的stage构成的,每个stage都完成一些特定的工作。下图是D3D 1...

2020-05-08 10:08:59 1166 1

原创 GPU渲染管线之旅|02 GPU内存架构和命令处理器

系列文章原发布在自己搭建的博客上:https://binean.top/上一篇中主要介绍了3D渲染命令到达GPU之前经历过的各个阶段。用下图可以概括上一篇中所讲的内容,当然其中很多细节没有出现在图中。之前我们说KMD将命令送给了硬件,这个简单的“送”的过程实际上并不是那么简单的。我们知道显卡都是通过信号线连在主板上的,所以我们送命令都是需要走这些信号线的。还有就是我们把命令送给显卡,那显卡总...

2020-05-04 17:51:21 995

原创 GPU渲染管线之旅|01 从App到硬件各个层级

0. 介绍从App到硬件各个层级 (Introduction: the Software stack)我在这里发布了东西已经有一段时间了,我可能会用这个地方来解释一些关于2011年图形硬件和软件的一般观点。通常你可以找到你电脑中显卡调用栈的相关描述,但是这些调用关系是如何工作?它们又是为什么要这样呢?这些问题就不那么容易找到答案了。我会尽量填补空白,而不会对特定的硬件进行具体的描述。我将主要讨论...

2020-05-04 13:16:48 1185 3

原创 基于小安派AiPi-Eye-S1的Nes游戏机

也可以使用锂电池给板子供电,实测壳体的液晶屏和PCB之间的间距足够放下一个3.7v的锂电池。UI界面分为两层,底层是game的界面,上浮的一层显示的是game手柄的8个触摸按键。为了方便的确定触摸按键的位置,特地在solidworks中绘制了一个草图,用草图的尺寸来方便确定每个按键的屏幕像素坐标。在完成每一行的解码后,在这个task中会及时的去渲染屏幕中的对应行。额外需要说明的是显示是使用的横向的坐标系,但是触摸驱动使用的是纵向的坐标系。他们的坐标原点是不一样的,需要进行坐标的变换。

2023-10-29 14:35:28 304

原创 谈谈OpenCV中的四边形

首先抛出一个问题,给定一系列二维平面上的的点,这些点是可以组成一个封闭的二维图形。因为这些点是矩形区域拍摄图像后识别得到的图形的边界点,所以我们要抽象出来这个矩形,也就是我们要反映出这个矩形。问题是在拍照的时候摄像头可能不是正对着图形的,那么矩形就必然在图像上反映为一个四边形, 如下图所示。那怎么得到这个四边形的四个顶点呢?使用经典图像处理的算法的话可以使用OpenCV提供了几个和矩形相关的函数接口。另一类就是使用机器学习类算法检测定位四个角点。首先来看看使用经典图像处理的算法来进行解决。1.最小包络

2021-01-16 14:19:06 5517

原创 Python链家二手房数据分析

from bs4 import BeautifulSoupimport matplotlib.pyplot as pltfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.pipeline import make_pipelinefrom sklearn.linear_model import Ridgefro

2019-01-15 23:52:48 1778

原创 C++内存管理(2)—内存操作相关函数

转载请注明出处:https://www.jianshu.com/p/ca51012db547C++内存管理(1)——分配和释放的四个层面 上一篇中从整体上来看系统中四个层面上内存的分配和释放,这样我们就对内存分配有了一个整体的认识。这一节则详细的来写写这四个层面中的操作符或函数的使用方法,以及他们背后的调用关系。首先我们从我们使用最多的new和delete来说起。1. new 和 dele...

2019-01-15 23:49:41 687

原创 C++内存管理(1)—分配和释放的四个层面

转载请注明出处 https://www.jianshu.com/p/8f5e4d215d971. 站在高处思考从一个比较高的角度来看,内存管理说到底就是使用OS提供的API或是使用运行在OS之上的Runtime或者更为上层的SDK对内存进行申请和释放。C/C++中内存管理是个经久不衰的话题,因为C/C++不像其它语言那样拥有自己的GC机制。这也是C/C++为人诟病的地方,特别对于使用C/C...

2019-01-15 23:48:49 929

原创 AI与医学辅助诊断

人工智能一词越来越频繁的出现在日常生活中。一种事物的时髦,必然有其背后的原因。而对于这样一个大的话题,从整体上来叙述总显得有些不接地气。作为跟AI沾过一些边的博主将以自己接触的方面来发表一点看法。 首先介绍一下,博主在研究生期间从事医疗数字影像研究和医疗系统开发,期间跟临床医生也有过一些交流,研究生课题也是智能辅助诊断的研究。因此,文章可能会实际工程使用为主要的着眼点,来表述一下对是否加入AI这一浪

2017-07-22 22:23:18 20102 6

原创 D3D 9和D3D 11绘制流水线对比

绘制流水线(pipline)是图形学编程中属于各种图形学框架的骨架。Windows平台下3D游戏开发几乎都会用到D3D来进行游戏引擎的设计。D3D 9是使用比较广泛的一个版本,D3D 9 中比较核心的就是固定渲染管线(Fixed Function Pipline)。下图是从官方的SDK中翻译的,从这个图中就可以比较清晰的看到D3D 9的绘制流水线。 D3D 9 的绘制流水线 从图中标有颜

2017-07-22 18:51:38 2930 1

原创 Java网络编程 - 非阻塞IO模型

1. Java NIO简介NIO(Non-Block I/O)是在JDK1.4之后引入的。NIO弥补了同步阻塞I/O的缺点。提供了高速、面向块的I/O。 在NIO库中,所有的数据都是用缓冲区来处理的,在读取数据的时候,他是直接读到缓冲区中的:在写数据时,写到缓冲区中。任何时候访问NIO中的数据都是通过缓冲区进行操作。 Java NIO由三个核心部分组成,Buffers, Channel和Sele

2017-05-22 21:14:32 1489

原创 Java网络编程 - 同步阻塞IO模型

由于项目需要使用Java开发后台服务器程序,C/C++程序员就要学学Java了。Unix/Linux下的几种网络IO模型在之前的博客中已经提及到,但是使用的大多数都是Unix/Linux下的系统调用。 博客内容大多数来自网络资料以及书籍《Netty权威指南》,转载请注明出处,谢谢!如果想了解Unix/Linux下网络IO模型的可以看如下的几篇相关博客,里面大多都是代码段,原理性的讲解比较少。

2017-01-12 16:07:16 2266

原创 OpenCV - 最大熵分割

转载请注明出处,谢谢.图像分割系列的博客连续写了两篇了,这次继续写写利用最大熵模型来进行图像的阈值分割。如果对其他相关博客感兴趣可进入下面的链接查看: 1. OpenCV - 区域生长算法 2. OpenCV - 均值迭代分割 3. OpenCV - 最大间方差(OTUS)分割1. 最大熵是什么?这里所说的熵是指信息熵,信息熵是来自于信息论的一个词,它是对系统所含信息的一种度量。通俗的讲,系

2016-12-29 18:58:31 8818 3

原创 OpenCV - 最大间方差分割

OpenCV中其实有对OTUS算法的实现,threhold()函数最后一个参数可以指定使用OTUS算法。1、最大方差(OTUS)算法的描述和均值迭代算法相似,OTUS算法也是利用图像的直方图进行的。OTUS算法的思想是选取一个阈值T,T∈[0,m−1]T, T \in [0,m-1],mm为图像的灰度级将直方图两部分,TT值使得分成的两组间方差最大。2、算法的步骤待处理图像灰度值范围为[0,m−1

2016-12-06 20:10:19 3425

原创 OpenCV - 均值迭代分割

【题外话】:之前在博客中写过一篇“区域生长”的博客,区域生长在平时经常用到,也比较容易理解和代码实现,所以在很多情况下大家会选择这种方法。但是区域生长有一个最致命的点就是需要选取一个生长的种子点。 为了交流学习,同时也为了后面查阅方便,准备陆续将基于直方图的几种分割算法加以总结。1、均值迭代算法的描述对一幅图像MM,均值迭代算法就是要迭代计算得到一个灰度值TT,使得这个灰度值TT将图像分成的

2016-12-03 23:12:24 4739 1

原创 Linux服务器上搭建SVN

示例在Linux debian上安装SVN服务软件1. 安装SVN服务软件ubuntu或者debian上可以直接用apt-get,centos上可以使用yum,或者下载安装包都可以,软件名为subversion。sudo apt-get install subversion 安装完成之后可以使用svnserve --help来验证安装是否正常。2. 创建仓库使用create来建立一个仓库svna

2016-11-22 16:04:13 1626

原创 DICOM影像中的窗宽窗位

1. 为什么有窗宽窗位?医学图像领域的关键技术窗技术,是CT检查中用以观察不同密度的正常组织或病变的一种显示技术,包括窗宽(window width)和窗位(window level)。由于各种组织结构或病变具有不同的CT值,因此想要显示某一组织结构细节时,应该选择适合观察该组织或病变的窗宽和窗位,以获得最佳显示。 2. 窗宽窗宽是CT图像上显示的CT值范围,在此CT值范围内的组织和病变均

2016-11-17 19:38:57 11488

转载 STL中的所有算法(70个)

STL算法部分主要由头文件,,组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含,中则定义了一些模板类,用来声明函数对象。    STL中算法大致分为四类:        1、非可变序列算法:指不直接修改其所操作的容器内容的算法。        2、可变序列算法:指可以修改它们所操作的容器内容的算法。        3、排序算法:包括对序列进行排序和合并的算法、

2016-11-17 19:10:24 5996 3

原创 STL常用算法

#include 算法常用版本描述返回Typestd::find()find(_InIt _Fisrt,_InIt _Last,_Ty& _Val);从两个迭代器指定的范围中查找指定值引用被查找的值的iterator或end()std::find_if()

2016-11-17 19:04:53 1431

原创 机器学习 - GMM参数估计的EM算法

看理论之前先来【举个例子】: 对于一个未知参数的模型,我们观测他的输出,得到下图这样的直方图:我们先假设它是由两个高斯分布混合叠加而成的,那么我们该怎么去得到这两个高斯分布的参数呢? EM算法!!1. 高斯混合模型假设观测数据 y1,y2,...,yNy_{1},y_{2},...,y_{N} 是由高斯混合模型生成的。 P(y|θ)=∑k=1Kαkθ(y|θk)P(y | \theta) =

2016-11-09 14:16:23 5336

原创 数据高低位交换

一、容易想到的方法unsigned char shift_fun1(unsigned char data) { unsigned char i; unsigned char tmp=0x00; for(i=0;i<8;i++) { tmp=((data>>i)&0x01)|tmp; if(i<7)

2016-10-25 17:24:44 4655

原创 OJ编程题教训

引用来自牛客网的一个讨论帖,帖子中列举了最常见的问题。 循环输入输出处理常见问题 1、为什么需要循环输入输出:通常来说OJ对于每道题里面有.in和.out文件,分别表示测试数据的输入和输出。如果某些编程题的所有数据都只做在一个.in和一个.out中,这样就会变成多组测试了,所以需要提交的代码中循环处理。 2、处理方法:其实这个问题可以避免,就是编程题后台每个样例做一组对应的.in和.

2016-09-06 15:05:52 4815

转载 堆和栈的区别

博客转自网上,经过简单整理。一、预备知识(程序的内存分配)一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全

2016-09-02 09:29:40 882

原创 算法学习 - 快速排序相关

1. 划分快速排序中最重要的步骤就是划分,即选择一个元素(很多地方称为枢纽元素),将序列划分成两部分,比枢纽元素大的放在枢纽元素的右边,比枢纽元素小的放在枢纽元素的左边。划分函数的思想:1. 选择一个枢纽元素(以选择序列的第一个元素为例),暂存到临时变量中2. 从序列的右边向左查找,找到一个比枢纽元素小的值。若找到,则将这个值填入到枢纽元素的位置3. 从序列的左边向右查找,找到

2016-08-31 10:18:13 1231

原创 拷贝构造函数和赋值操作符

#include using namespace std;class Sales_Item{public: //构造函数 Sales_Item() : units_sold(0), revenue(0.0) { cout << "构造函数" << endl; } //构造函数 Sales_Item(const std::string &book) : isbn(book

2016-08-30 20:26:37 936

转载 linux高级编程基础系列:线程间通信

线程间通信机制:线程是一种轻量级的进程。进程的通信机制主要包括无名管道、有名管道、消息队列、信号量、共享内存以及信号等。这些机制都是由linux内核来维护的,实现起来都比较复杂,而且占用大量的系统资源。线程间的通信机制实现起来则相对简单,主要包括互斥锁、条件变量、读写锁和线程信号等。本文会对以上所涉及的线程间的通信机制一一展开。互斥锁通信机制1、互斥锁基本原理:互斥锁以排他的方式防止数据被并

2016-08-26 10:54:37 1060

原创 【数据结构】二叉树的遍历

/* * 1.前序遍历的 递归实现和 非递归实现 * 2.中序遍历的 递归实现和 非递归实现 * 3.后序遍历的 递归实现和 非递归实现 * 4.根据两项遍历结果 重构树结构*/#include <iostream>#include <stdlib.h>#include <stack>using namespace std;struct BTreeNode{ int m_

2016-08-18 14:12:36 889

原创 【数据结构】链表相关内容

写一个已序链表,也就是说在链表添加节点的时候就将元素添加到合适的位置。#include <iostream>using namespace std;struct node{ int value; struct node * next;};void printnode(node* head){ while (head != NULL) { cou

2016-08-16 17:23:46 875

原创 机器学习 - 朴素贝叶斯法

博客内容源于《统计机器学习》一书的阅读笔记。Python的源码实现源于《机器学习实战》部分内容。首先,需要回顾下面的三个重要的公式: 条件概率: P(A|B)=P(AB)P(B)P(A|B) = \frac{P(AB)}{P(B)} 全概率公式: P(A)=∑iP(A|Bi)P(Bi)P(A) = \sum_{i}P(A|B_{i})P(B_{i}) 贝叶斯(Baye

2016-08-07 12:59:19 1263

原创 机器学习 - K近临法(KNN)

博客内容源于《统计机器学习》一书的阅读笔记。Python的源码实现源于《机器学习实战》部分内容。1. K近临算法【算法描述】给定一个训练数据集,对于新的输入实例,在训练数据集中找到与该实例最近临的K个实例,这个k个实例的多数属于某个类,就把该输入实例分为这个类。【数学描述】 输入:训练数据集 T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_{1},y_{1}),(

2016-08-05 10:38:57 1582

原创 机器学习 - 感知机

博客内容源于《统计机器学习》一书的阅读笔记。Python的源码实现源于《机器学习实战》部分内容。1. 感知机模型感知机是二分类的线性分类模型,该模型的输入为实例的特征向量,输出为实例的类别,一般取+1和-1两个值。感知机将实例划分为两类,属于判别模型。1.1 模型定义【感知机定义】 假设输入空间(特征空间)是X⊆Rn \mathcal{X} \subseteq R^{n},输出空间是Y={−1,

2016-08-04 10:01:30 2623

原创 牛顿迭代法求解方程

说明:该片博客源于博主的早些时候的一个csdn博客中的一篇,由于近期使用到了,所以再次作一总结。原文地址概述牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。1. 牛顿迭代公式设r r 是 f(x)=0 f(x) = 0 的根,选取 x0 x_{0} 作为r

2016-08-03 14:02:35 24380

原创 Unix/Linux下5种I/O模型

1. 五种I/O模型在网络编程,经常接触下述的I/O相关的概念:同步(Synchronous)异步(Asynchronous)阻塞(Blocking)非阻塞(Non-blocking)信号驱动(Signal driven)他们之间的关系如下图: 引用网上一个比喻: 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始

2016-07-26 17:39:59 1164

原创 C++四大类型转换

C++ 是一门强类型语言(C语言是弱类型语言),不同自定义类型之间的转换必须进行显式转换。C++ 中提供了四种转换操作符来细分显式类型转换。因为是操作符,所以他们不属于任何的namespace,也就不用包含任何头文件就可以使用。static_cast <new_type> (expression)const_cast <new_type> (expression)reinterpret_cast

2016-07-19 17:17:41 2637

原创 Unix系统编程(8) - I/O多路复用之epoll(Linux)

1. epoll的由来epoll是在Linux 2.6.28内核提出的,是select和poll的强化升级版本。相比select和poll,epoll更灵活,没有描述符限制。epoll在Unix中是没有的。 epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。2. epoll的使用Linux 2.6.28之后

2016-07-19 15:58:10 1348

Java_TCP_IP_Socket编程

Java_TCP_IP_Socket编程.pdf

2017-01-11

Android OpenCV应用程序设计

Android OpenCV应用程序设计_完整版PDF电子书

2017-01-11

dll封装MFC对话框资源

dll封装MFC对话框资源,博客中的源码工程。可以参看dll的资源封装以及使用。

2015-12-11

MFC窗口分割例子

MFC窗口分割的代码实例,使用VS2012实现,包括对分割条的绘制和修改

2015-11-21

mfc中嵌入google map

mfc界面中嵌入google map.通过mfc调用javascript来对地图进行交互。

2015-10-27

visual C++实践与提高:串口通信与工程应用

文档内介绍了MFC开发串口上位机程序的完整内容。

2015-01-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除