请解释我HLSL VertexShder

时间:2017-03-20 10:58:13

标签: 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 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;

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

首先,POSITION和SV_POSITION语义有什么区别?你会推荐一本好的HLSL教程书吗?我是韩国人,我住在韩国。这里没有好书;我不知道为什么,所有好书都已绝版。学习编程真是一个糟糕的国家。

第二,为什么在CPU向GPU提供数据之前,我应该移植我的相机矩阵(world view proj矩阵)?它的顶点*矩阵=已处理的顶点。我为什么要转置它?

1 个答案:

答案 0 :(得分:1)

井位置(语义)为GPU提供指令,具体值将作为坐标空间中的点放置,SV_POSITION为像素着色器提供指令。实际上它给GPU命令屏幕上的像素位置主要在-1到1的范围内。看看https://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx

你似乎需要线性代数课程交配。矩阵换位是3d图形的关键。使用Matrix转置(同时转置矩阵是逆矩阵,逆矩阵始终是正交),所有矩阵转换都在发生(转换,旋转,缩放)。首先,你需要线性代数的东西,关于渲染Api,无论是OpenGL还是DirectX(更不用说它们只是API' s)你可以获取任何书籍或在线文档,你可以看看amazon.com。快乐的图形编码朋友;)。