我使用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矩阵)?它的顶点*矩阵=已处理的顶点。我为什么要转置它?
答案 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。快乐的图形编码朋友;)。