- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 DirectX 的新手,我在理解一些我认为的基础知识时遇到了一些问题。假设我有 10 个三角形,我想以不同的速率旋转每个三角形,以便它们随着时间的推移“旋转”。
到目前为止,我的三角形出现了,但我不太明白如何单独旋转它们。据我所知,我会为每个三角形做这样的事情吗?
是吗?好像来来回回很多。我是应该依靠顶点着色器来进行变换,还是有不同的方法在每个“对象”(三角形)的基础上应用旋转?
如果我的问题没有意义,我深表歉意,就像我说的,我认为我遇到了概念/理解问题。
最佳答案
基本上,您有一些模型(在您的例子中是三角形)。
模型是顶点数组:
struct Vertex
{
float3 position;
float3 normal;
float2 texcoord;
float4 color;
// other vertex attributes goes here
};
您在初始化时创建一次顶点(和索引)缓冲区。
std::vector<Vertex> vertices = { /*vertex data goes here*/ };
VertexBuffer vb = renderer->CreateVertexBuffer(&vertices[0], vertices.size());
您的 3D 世界是一组对象,它们是您模型的实例。
struct MyObject
{
float3 position;
float3 rotation;
float3 scale;
// other instance attributes goes here (it can be whatever you want)
};
std::vector<MyObject> objects = { /*objects data goes here*/ };
基本上对象的属性是顶点属性的修饰符,所以所有对象都有相同的模型,但在你的世界中看起来不同(在这个例子中它们有不同的位置)。
通常在模型空间中定义的每个顶点的位置(以及法线、切线和副切线)。要将它移动(转换)到世界空间,您可以将每个顶点的 position
乘以当前对象的矩阵。你不想在 CPU 上做,因为它很慢。 Vertex buffer保持不变(当然,你可以改变它,实现变形、曲面 segmentation 等效果,但我们不是这样)。
因此,您在顶点(或几何)着色器中进行变换。而且您必须以某种方式将当前对象的变换(和其他实例属性)的信息发送到顶点着色器。
一种方法是常量缓冲区。
假设您在顶点着色器中有 cbuffer:
cbuffer Instance
{
matrix worldMatrix;
// other instance parameters goes here
};
而且你必须用数据填充它。
在绘制每个对象之前,您使用当前的实例数据更新缓冲区(每个对象一次(每帧多次)):
renderer->SetVertexBuffer(vb); // Set needed geometry
for(int i = 0; i < objects.size(); ++i) // for each object
{
matrix worldMatrix = CalculateWorldMatrix(objects[i]); // prepare data of current object
renderer->UpdateConstantBuffer(&worldMatrix); // Tell shaders about current object's attributes (world matrix in our case)
renderer->Draw(); // or DrawIndexed();
}
对于 n
个对象,您有 n
个绘制调用和 n
个缓冲区更新。
另一种方式是实例缓冲区。
您再创建一个顶点缓冲区,它保存的不是顶点数据,而是准备供着色器使用的实例数据。
您计算实例数据并创建实例缓冲区一次:
for(int i = 0; i < objects.size(); ++i) // for each object
{
std::vector<Instance> instances;
instances[i].worldMatrix = CalculateWorldMatrix(objects[i]);
// other instance parameters goes here
}
VertexBuffer instanceBuffer = renderer->CreateVertexBuffer(&instances[0], instances.size());
而且您还必须更改输入布局,因此着色器除了顶点数据之外还需要实例数据。
绘制时,您只需绑定(bind)顶点和实例缓冲区。不需要缓冲区更新(如果你的三角形没有被移动)。不再需要矩阵计算。因此,没有 for
循环,只有一个(!)绘制调用。
renderer->SetVertexBuffers(2, vb, instanceBuffer); // Set needed model data and instances data
renderer->DrawInstanced(); // or DrawIndexedInstanced();
如果您反对更改它们的参数:位置、颜色等,您只更新实例缓冲区。
当绘制复杂的场景时,您通常会同时使用:常量缓冲区(用于所有或许多对象共享的属性: View 矩阵、投影矩阵等)和实例化(如果您的对象具有相同的模型几何形状,但属性不同), 以发挥他们的优势。
关于c++ - D3D11 : Rotating Multiple Triangles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18522172/
我有以下三 Angular 形 由以下 css 创建: .triangle { width: 0; height: 0; border-left: 5px solid tran
在(不久前)阅读索引索引的三角形列表后,由于需要较少的绘制调用,因此我决定在三角形列表上构建我的引擎。今天,我偶然发现了0xffffffff,在DX中该值被认为是 strip 切割索引,因此您可以在一
该类包含: 三个 double 数据字段,分别命名为 side1、side2 和 side3,具有默认值1.0 表示三角形的三边 无参数构造函数,用于创建具有指定 side1、side2 和 side
我一直在尝试用 C 语言解决 HackerRank 网站中的“小三角形,大三角形”问题,这是一种排序数组问题,我使用了选择排序算法。我的代码似乎可以工作,但它仅适用于某些测试用例。这是任务: You
我需要打印一个三角形及其倒三角形(站在其尖端)。我设法只打印出三角形。我知道我可以轻松使用 for 循环,但我想知道如何使用递归,就我而言,我不知道如何打印三角形和倒三角形。谢谢。 Example d
如果使用函数 triangular_mesh 可以传递一组三角形,以索引列表、顶点位置和一组数据的形式给出,以将颜色分配给顶点。然后通过顶点颜色之间的插值对三角形着色。 如何在不进行任何插值的情况下按
我正在实现 Wikipedia 中介绍的 Bowyer-Watson 算法.在我的实现中,一切都如我所料,直到伪代码的最后一部分: for each triangle in triangulation
题目地址 https://leetcode.com/problems/triangle/description/ 题目描述: Given a triangle, find the minimum
我想知道是否有一些教程或指南来理解和实现 3D 环境中的三角形-三角形相交测试。 (我不需要知道交叉点发生的确切位置,但只需要知道交叉点已经发生) 我打算按照理论 pdf 来实现它,但我很困在 计算三
我制作了一个程序来制作帕斯卡三角形并输入数字(行)> 5,存在对齐问题,即 ncr > 10。请帮帮我。我已经包含了程序输出的图像。 Output Image #include int factori
由于很难解释,我将向您展示我假装的图像。 问题不在于“三 Angular 形”,而在于要在三 Angular 形生成的“空间”中显示的图像背景。 最佳答案 这是我的方法,如何处理这个任务。我将伪元素
题目地址:https://leetcode.com/problems/pascals-triangle/open in new window Total Accepted: 83023 Total
如何使用 Triangle.NET 对具有如下所示孔的多边形进行三角剖分? 我需要由三角形覆盖的绿色区域。我想我需要在触摸点上分割外部轮廓的右侧部分,但之后我不知道是否需要将两个轮廓合并为一个(在黑色
我在碰撞检测代码中使用的代码是这样的: (注意:Vector3f 是 LWJGL 库的一部分。) (注2:Tri是由LWJGL的Vector3fs.v1、v2、v3三个组成的类。) public Ve
有一个三角网格生成器(Shewchuk,CMU), "Triangle" ,由于其重量轻而受到人们的推荐。它是用 C 编写的。但是我无法在我的 VS2012 C++ 项目中使用它。我正在使用 x64
我应该编写的程序应该按以下方式打印三角形: 如果行数为2: * *** 如果行数为3: * * * ***** 但是,我所做的以下代码打印了最后一行的
(我在这里搜索并通读了钻石和虚拟继承问题,但找不到答案。我的想法是这种情况有点不寻常,我愿意考虑我的要求有点关闭。另一方面,我认为这应该以一种“不错”的方式实现。) 情况及要求: 我有一个 C++ 类
我构建 HTML/CSS/JS 菜单并希望将箭头向右对齐以指向该元素是子菜单。 我的问题是在 Firefox 中三 Angular 形(“▶”符号)显示在下一行而不是当前行... Chromium 在
我正在创建一个 OpenGL 程序,它只是创建一个三角形并将其绘制在屏幕上。我创建了一个名为 Drawable 的类,其中包含绘制函数以及使用的 VAO 和 VBO 对象。我还创建了一个继承自 Dra
我正在尝试使用嵌套循环打印下面的图片(我应该使用 for 和 while 循环): ** **** ****** ******** 以 5 个空格开头,每行减少 2 个空格。从 2
我是一名优秀的程序员,十分优秀!