首页 > 解决方案 > 如何同时使用实例化和世界翻译?

问题描述

我正在尝试优化我的应用程序,因此我开始使用实例化来避免对同一对象的多次绘制调用。但我无法理解的是如何将每个实例对象定位在正确的位置,我一直在学习 Rastertek 教程,这是他们的着色器代码:

struct VertexInputType
{
    float4 position : POSITION;
    float2 tex : TEXCOORD0;
    float3 instancePosition : TEXCOORD1;
};

struct PixelInputType
{
    float4 position : SV_POSITION;
    float2 tex : TEXCOORD0;
};

////////////////////////////////////////////////////////////////////////////////
// Vertex Shader
////////////////////////////////////////////////////////////////////////////////
PixelInputType TextureVertexShader(VertexInputType input)
{
    PixelInputType output;


// Change the position vector to be 4 units for proper matrix calculations.
    input.position.w = 1.0f;

// Update the position of the vertices based on the data for this particular instance.
    input.position.x += input.instancePosition.x;
    input.position.y += input.instancePosition.y;
    input.position.z += input.instancePosition.z;

// Calculate the position of the vertex against the world, view, and projection matrices.
    output.position = mul(input.position, worldMatrix);
    output.position = mul(output.position, viewMatrix);
    output.position = mul(output.position, projectionMatrix);

// Store the texture coordinates for the pixel shader.
    output.tex = input.tex;

    return output;
}

我一直在我的世界矩阵上使用XMMatrixTranslationfromDirectXMath.h来放置每个对象,但现在看起来实例对象必须直接在着色器上获取它们的坐标,并且我知道这将对每个实例上的每个顶点完成.

这真的让我很困惑,如果对象的每个实例都已经被放置在世界中,那么世界矩阵的目的是instancePosition什么?如果有办法继续使用我的世界矩阵将同一对象的每个实例转换到世界上,那对我来说会好很多倍,但我不知道是否有可能,如果有人知道任何可以帮助我的事情这会很棒。

标签: c++direct3d

解决方案


推荐阅读