DirectX11 顶点着色器阶段

2023-12-20 09:08

本文主要是介绍DirectX11 顶点着色器阶段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

顶点着色器阶段
1. 顶点着色器阶段完成什么工作?
在完成图元装配后,顶点将被送往顶点着色器(vertex shader)阶段。顶点着色器可以被看成是一个以顶点作为输入输出数据的函数。每个将要绘制的顶点都会通过顶点着色器推送至硬件;实际上,我们可以概念性地认为在硬件上执行了如下代码:

for(UINT i = 0; i < numVertices; ++i)outputVertex[i] = VertexShader(inputVertex[i]);

顶点着色器函数由我们自己编写,但是它会在GPU上运行,所以执行速度非常快。

许多效果,比如变换(transformation)、光照(lighting)和置换贴图映射(displacement mapping)都是由顶点着色器来实现的。记住,在顶点着色器中,我们不仅可以访问输入的顶点数据,也可以访问在内存中的纹理和其他数据,比如变换矩阵和场景灯光。

我们将会在本书中看到许多不同的顶点着色器示例;当读完本书时,读者会对顶点着色器的功能有一个全面的认识。不过,我们的第一个示例会比较简单,只是用顶点着色器实现顶点变换。在随后的小节中,我们将讲解各种常用的变换算法。

2. 观察空间
XNA库提供了如下函数,根据刚才描述的过程计算观察矩阵:

XMMATRIX XMMatrixLookAtLH( // Outputs resulting view matrix VFXMVECTOR EyePosition,   // Input camera position QFXMVECTOR FocusPosition,   // Input target point TFXMVECTOR UpDirection);  // Input world up vector j

通常,世界坐标系的y轴就是“向上”方向,所以“向上”向量j通常设为(0, 1,0)。举一个例子,假设摄像机相对于世界空间的位置为(5, 3, −10),目标点为世界原点(0, 0,0)。我们可以使用如下代码创建观察矩阵:

XMVECTOR pos = XMVectorSet(5,3,-10,1.0f);
XMVECTOR target = XMVectorZero();
XMVECTOR up = XMVectorSet(0.0f,1.0f,0.0f,0.0f);
XMMATRIXV = XMMatrixLookAtLH(pos,target,up);

3. XMMatrixPerspectiveFovLH
透视投影矩阵可由如下XNA函数生成:

XMMATRIX XMMatrixPerspective FovLH(// returns projection matrixFLOAT FovAngleY, // vertical field of view angle in radiansFLOAT AspectRatio, // aspect ratio =  width / heightFLOAT NearZ, // distance to near planeFLOAT FarZ);  // distance to far plane

下面的代码片段示范了XMMatrixPerspectiveFovLH函数的使用方法。这里,我们将垂直视域角设为45°,近平面z设为1,远平面z设为1000(这些长度是在观察空间中的)。

XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f*MathX::Pi,AspectRatio(),1.0f,1000.0f);

横纵比要匹配窗口的横纵比:

float D3Dapp::AspectRatio() const
{return static_cast<float>(mClientWidth)/mClientHeight;
}

这篇关于DirectX11 顶点着色器阶段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/515480

相关文章

POJ3041 最小顶点覆盖

N*N的矩阵,有些格子有物体,每次消除一行或一列,最少要几次消灭完。 行i - >列j 连边,表示(i,j)处有物体,即 边表示 物体。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;impo

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

OPENGL顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

8阶段项目:五子棋(附带源码)

8阶段项目:五子棋 8.1-技术实现 1.静态变量 静态变量只能定义在类中,不能定义在方法中。静态变量可以在static修饰的方法中使用,也可以在非静态的方法中访问。主要解决在静态方法中不能访问非静态的变量。 2.静态方法 静态方法就相当于一个箱子,只是这个箱子中装的是代码,需要使用这些代码的时候,就把这个箱子放在指定的位置即可。   /*** 静态变量和静态方法*/public cl

2023 CCPC(秦皇岛)现场(第二届环球杯.第 2 阶段:秦皇岛)部分题解

所有题目链接:Dashboard - The 2023 CCPC (Qinhuangdao) Onsite (The 2nd Universal Cup. Stage 9: Qinhuangdao) - Codeforces 中文题面: contest-37054-zh.pdf (codeforces.com) G. Path 链接: Problem - G - Codeforces

【笔记-流程记录】从零开始做一个人形怪兽(建模阶段)

大型 1.第一步还是找素模,打开材质球,吸管点一下,就会出现素模的贴图,一共有四个 比如,点进去第一个,再点漫反射,再点psd就会得到相应的贴图 2.然后我们依然是面片然后插入参考图 如果透视窗口啥都没有,按g也不显示线框。那按下z(居中视图),然后再试一下按G显示栅格。 3.导入素模,重置变换 注释:重置变换是一个非常有用的功能,主要用于将对象的变换属性(位置、旋

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

[Android] [SnapdragonCamera] 单摄(横屏)阶段总结

在研高通平台的单摄项目中遇到了很多适配问题,做一下初步的总结,为今后遇到相似的问题,提供参考方案。          1. 横屏设置相机预览显示不正常               1.1问题现象                       1.2分析与解决              骁龙相机默认的预览方向是“portrait”。在横屏设备上显示的时候就会出现上面效果。实际

鸿蒙(API 12 Beta6版)超帧功能开发【顶点标记】

超帧提供两种运动估计模式供开发者选择:分别为基础模式和增强模式。其中增强模式需要对绘制顶点的Draw Call命令进行额外的标记,在相机和物体快速运动的游戏场景超帧效果较基础模式更优,能够有效改善拖影问题。本章主要介绍增强模式的运动估计原理及顶点标记方法。 说明 Draw Call:指图形驱动库(OpenGL ES)中进行绘制的命令,例如glDrawElements、glDrawArrays、

Unity3D Shader详解:只画顶点或只画线框

在Unity3D开发中,Shader是控制渲染过程的关键组件,它允许开发者自定义物体的渲染方式。有时,为了特定的视觉效果,我们可能需要只渲染模型的顶点或者只显示其线框。下面,我们将详细探讨这两种效果的技术实现,并给出相应的代码示例。 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 只画顶点 在Unity中直接“只画顶点”的概念可能不是非常直观,因为顶点本身只是模型