有什么网站可以发布个人信息,主要网站 开发语言,wordpress关键词内链图片,wordpress页面构建目录
图形管线
纹理映射 图形管线
给我一个三维模型#xff0c;给我一个光照条件#xff0c;我就能够得出渲染的结果#xff0c;这些东西合起来就是Graphics Pipeline#xff0c;图形管线#xff0c;闫神愿称之为实时渲染管线#xff0c;那下面这个流程图就是这个渲染…目录
图形管线
纹理映射 图形管线
给我一个三维模型给我一个光照条件我就能够得出渲染的结果这些东西合起来就是Graphics Pipeline图形管线闫神愿称之为实时渲染管线那下面这个流程图就是这个渲染流水线
对于给我的这个三维模型的点首先通过投影变换到平面上然后这些点会形成三角形我们需要将这个三角形显示在屏幕上但是这个屏幕是离散的我们通过光栅化离散这个三角形形成这个fragments这个是OpenGL里面的概念叫片段、片源、片元就类似于我们着色时的像素然后就对每个像素进行着色完了就可以显示在屏幕上这个就是渲染的流水线就是从三维场景渲染出二维屏幕的操作 我们来举个例子我们之前说的Model, View, Projection transforms就是这个MVP变换是对每个顶点做这么一个变换 然后对于顶点形成的三角形我去采样去判断这个在不在三角形内部这个是光栅化 然后通过这个深度缓冲来解决这个光栅化过程中这个fragments远近的问题 再然后着色的时候我们说有不同的着色频率对不对有平面着色、顶点着色和像素着色那么这个着色就会发生在处理顶点和处理fragments的时候这也是为什么会有两个着色器的原因就是vertex shader和fragment shader这个着色器shader就是一段代码这个代码呢就是控制这个顶点和这个fragment是如何进行着色的等下会分析一个shader 还有就是真实的三角形它其实不同的地方会有不一样的这个纹理这个操作叫纹理映射稍后会讲
然后我们来看一个shader这个shader是一个可以在硬件执行的语言专门写给GPU跑的GPU核又多又轻量是吧就是用来干这个简单的并行计算的然后这里举了个OpenGL的shader语言GLSL注意一个shader它是通用的不需要为每个顶点或者每个fragment写一个当然顶点着色器和片元或者是像素着色器需要分开
终于看见代码了是吧狂喜……这个着色器就是完成这个着色的过程这个uniform指的是全局变量一个纹理一个光照方向对吧这个uv呢是一个纹理坐标uv二维向量这个norm就是法线三维向量这个kd是漫反射系数跟这个纹理有关哈然后去计算这个光照拿这个光照方向和法线方向做点乘得到余弦值还记得吗然后用这个clamp限制在0到1之间shader瞬间入门属于是
uniform sampler2D myTexture; // program parameter
uniform vec3 lightDir; // program parameter
varying vec2 uv; // per fragment value (interp. by rasterizer)
varying vec3 norm; // per fragment value (interp. by rasterizer)
void diffuseShader()
{ vec3 kd; kd texture2d(myTexture, uv); // material color from texturekd * clamp(dot(–lightDir, norm), 0.0, 1.0); // Lambertian shading modelgl_FragColor vec4(kd, 1.0); // output fragment color
}
闫神提到的一个网站Snail (shadertoy.com)可以通过编写shader感受不同的渲染效果
纹理映射
在着色的时候我们说一个三维物体它不同表面的纹理可能是不一样的三维物体它的表面应该是二维的好比这个地球仪我们把它表面给展开得到一个二维的纹理那么三维物体表面上一点就会对应展开的二维纹理上的一点那么它们之间就会存在一种映射的关系 那怎么操作呢比方说下面这个独眼哥我怎么将这个纹理给它映射上去呢取一个三角形小块如果我知道这一块三角形在纹理上的对应位置那是不是就可以找到对应的点给它上色是吧
但是这个事情我怎么知道呢o.O?
这个有两个解决办法一个是在这个三维模型创造的时候就展开得到这个纹理图这个对应关系是由这个艺术家美工完成的还有一个就是参数化就是给我一个模型我能够自动的展开纹理并且得到这个对应关系这个很复杂很难
反正我们就是可以知道这个纹理对于三维物体的对应位置 然后每个顶点都会分配这个纹理的坐标uv