Directx 请给我解释一下

Directx 请给我解释一下,directx,Directx,我正在使用vs2015并学习dx11。 我先给你看代码 cbuffer cbperobject { float4x4 gWorldViewProj; }; struct VertexIn { float3 Pos : POSITION; float4 Color : COLOR; }; struct VertexOut { float4 PosH : SV_POSITION; float4 Color : COLOR; }; VertexOut m

我正在使用vs2015并学习dx11。 我先给你看代码

cbuffer cbperobject {
    float4x4 gWorldViewProj;
};

struct VertexIn {
    float3 Pos : POSITION;
    float4 Color : COLOR;
};

struct VertexOut {
    float4 PosH : SV_POSITION;
    float4 Color : COLOR;

};

VertexOut main( VertexIn vin ) 
{
    VertexOut vOut;

    vOut.PosH = mul(float4(vin.Pos, 1.0f), gWorldViewProj);
    vOut.Color = vin.Color;
    return vOut;
}
这是我的顶点着色器代码。我是从网上抄的

HRESULT result;
D3D11_MAPPED_SUBRESOURCE mappedResource;
XMMATRIX* dataPtr;
UINT bufferNumber;


// Transpose the matrices to prepare them for the shader.


// Lock the constant buffer so it can be written to.
result = mD3dDContext->Map(contantBuff, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
    return false;
}

// Get a pointer to the data in the constant buffer.
dataPtr = (XMMATRIX*)mappedResource.pData;

// Copy the matrices into the constant buffer.
XMMATRIX world = XMLoadFloat4x4(&mWorld);         // 버텍스의 월드변환
XMMATRIX view = XMLoadFloat4x4(&mView);       // 카메라
XMMATRIX proj = XMLoadFloat4x4(&mProj);       // 직교투영
XMMATRIX worldViewProj = world*view*proj;
worldViewProj = XMMatrixTranspose(worldViewProj);
*dataPtr = worldViewProj;

// Unlock the constant buffer.
mD3dDContext->Unmap(contantBuff, 0);

// Set the position of the constant buffer in the vertex shader.
bufferNumber = 0;

// Finanly set the constant buffer in the vertex shader with the updated values.
mD3dDContext->VSSetConstantBuffers(bufferNumber, 1, &contantBuff);

return true;
这是我在着色器代码中设置的常量缓冲区

首先,位置和SV_位置语义有什么区别?你会推荐好的HLSL教程吗?我是韩国人,我住在韩国。这里没有好书;我不知道为什么,所有的好书都绝版了。学习编程是多么糟糕的国家啊

其次,为什么我要在CPU将数据提供给GPU之前转置我的相机矩阵(worldviewproj矩阵)?它是顶点*矩阵=处理过的顶点。为什么要转置它?

井位置(语义)为GPU提供了指示,具体值将作为坐标空间中的点放置,SV_位置为像素着色器提供了指示。实际上,它主要在-1到1的范围内给GPU关于屏幕上像素位置的命令。看看这个


看来你需要上线性代数课,伙计。矩阵变换是三维图形的关键。通过矩阵变换(同时变换后的矩阵是逆矩阵,逆矩阵总是正交的),所有矩阵变换都在发生(平移、旋转、缩放)。首先,你需要线性代数的知识和关于渲染Api的知识,无论是OpenGL还是DirectX(更不用说它们只是Api),你可以从amazon.com上找到任何书籍或在线文档。快乐图形编码pal;)

谢谢你的回答。关于数学。。。A=顶点M=变换矩阵。C=变换顶点。我知道线性代数,但我已经知道M,那么A*M=C,不是吗?我的问题是为什么我首先需要逆矩阵?不是如何获得逆矩阵顶点着色器是通过GPU在屏幕空间(视图空间或相机空间)中标记顶点,这些顶点将在视锥台中转换,因为转换矩阵是必不可少的。当顶点着色器完成整个工作时,GPU将命令像素着色器使用颜色绘制顶点几何体。你们知道吗,这是关于数据如何存储在矩阵中。如果向量是行向量,则Vtranspose M=TV。如果是列向量,那么MV=TV。人们一直在谈论逆矩阵。我想知道它们的基础是什么和线性变换。你不需要一本书来学习着色器。互联网上有很多教程,只需谷歌一下。此外,我更倾向于跨平台GLSL,而不是特定于平台的HLSL。谢谢您的评论。我真正想要的是关于HLSL代码的非常详细的信息,比如SV_位置和位置之间的区别,如果我指定寄存器编号,我如何知道我有多少寄存器?就像那样。你可以在互联网上找到这些信息。无论如何,如果你想要一本书,那么我推荐Frank Luna的DirectX 12 3D游戏编程入门:这是学习DirectX 12和HLSL的最好的书