我有一个C++ DirectX 11渲染器,我一直在写。
我已经编写了一个Colada1.4.1加载程序来导入COLLADA数据,用于支持骨骼动画。
此时,我正在验证加载程序(以前在我使用不同技术编写的另一个渲染器中支持COLLADA ),并且遇到了将COLLADA与11 10/11匹配的问题。
我有三个独立的数据顶点缓冲区:
具有唯一顶点位置的顶点缓冲区。唯一法线的顶点缓冲器。具有独特纹理坐标的顶点缓冲区。
这些顶点缓冲区包含不同的数组长度(位置有2910个元素,法线有9000多个,纹理坐标大约有3200)。
COLLADA提供了一个三角形列表,它为给定的三角形提供了每个数组的索引(一开始是冗长而奇怪的,但一旦您使用了它,它最终就变得简单了)。
知道is 10/11支持多个顶点缓冲区,我想我将用索引填充is 10/11索引缓冲区到每个缓冲区*和* (这是重要的部分),对于给定的三角形点,这些索引可能是不同的。
换句话说,我可以设置三个顶点缓冲区,设置正确的输入布局,然后在索引缓冲区中放置相当于:
l_aIndexBuffer[ NumberOfTriangles * 3 ]
for( i = 0; i < NumberOfTriangles; i++ )
{
l_aIndexBufferData.add( triangle[i].Point1.PositionIndex )
l_aIndexBufferData.add( triangle[i].Point1.NormalIndex )
l_aIndexBufferData.add( triangle[i].Point1.TextureCoordinateIndex )
}关于在DirectX中使用多个顶点缓冲区的文档似乎没有提供任何有关这如何影响索引缓冲区的信息(稍后将详细介绍)。
以这种方式运行代码会产生奇怪的呈现结果,在这里我可以看到我间歇绘制的网格(奇怪的多边形,但大约三分之一的点位于正确的位置提示提示中)。
我想我在昨天的这个时候把我的数据或指数搞砸了,所以我仔细地验证了所有这些,所以我想我是在搞砸我的输入或者别的什么。我通过使用普通和纹理缓冲器中的值来替代设置像素着色器所使用的颜色值来消除这个问题,因为颜色是正确的,所以我没有遇到填充问题。
最后,我得出的结论是,so 10/11必须以不同的方式排序,所以我尝试以这种方式存储索引:
indices.add( Point1Position index )
indices.add( Point2Position index )
indices.add( Point3Position index )
indices.add( Point1Normal index )
indices.add( Point2Normal index )
indices.add( Point3Normal index )
indices.add( Point1TexCoord index )
indices.add( Point2TexCoord index )
indices.add( Point3TexCoord index )奇怪的是,这产生了一个渲染的网格,看起来是1/3正确的提示。
然后,我推测DX11 10/DX11 11可能需要“通过顶点缓冲器”存储的索引,这意味着我将首先为所有三角形添加所有位置索引,然后为所有三角形添加所有正常索引,然后为所有三角形添加所有纹理坐标索引。
这产生了另1/3的正确(看)网格。
这让我想到--那么,DX10 10/11肯定不能提供从多个顶点缓冲区流的能力,而实际上每个三角形点只期望一个索引?
只有将索引包含到位置的顶点缓冲区中,才能生成正确呈现的网格,不幸地使用错误的法线和纹理坐标。
结果表明,将法向坐标和纹理坐标索引放入索引缓冲器中,会导致错误绘制渲染的网格。
这是预期的行为吗?
多顶点缓冲区-一个索引缓冲区和索引缓冲区只能有一个索引点的三角形?
这对我来说是不合理的。
帮助!
发布于 2013-04-23 19:16:28
我脑子里第一件事就是:
所有支持计算着色器(几乎等于所有DirectX 10及更高版本)的硬件也支持ByteAddressBuffer,其中大多数支持StructuredBuffer。因此,您可以将数组绑定为SRV,并可以随机访问着色器中的任何元素。
像这样的东西(没有测试,只是伪代码):
// Indices passed as vertex buffer to shader
// Think of them as of "references" to real data
struct VS_INPUT
{
uint posidx;
uint noridx;
uint texidx;
}
// The real vertex data
// You pass it as structured buffers (similar to textures)
StructuredBuffer<float3> pos : register (t0);
StructuredBuffer<float3> nor : register (t1);
StructuredBuffer<float2> tex : register (t2);
VS_OUTPUT main(VS_INPUT indices)
{
// in shader you read data for current vertex
float3 pos = pos[indices.posidx];
float3 nor = nor[indices.noridx];
float2 tex = tex[indices.texidx];
// here you do something
}让我们称之为“计算着色器方法”。您必须使用DirectX 11 API。
此外,你可以用同样的方式绑定你的索引,并在着色器中做一些魔术。在这种情况下,您需要找到当前的索引id。也许你可以从SV_VertexId那里得到它。
也许您可以绕过这些缓冲区并以某种方式绑定数据( DirectX 9兼容的纹理采样!O_o )。
希望能帮上忙!
https://stackoverflow.com/questions/16174028
复制相似问题