我有一个从GLSL移植的简单DirectX9 HLSL像素着色器,我读到我需要将右手坐标系更改为Direct3D的默认左手坐标系。结果是我的输出被翻转了,数学是错误的。
像素着色器命令已正确从GLSL转换为HLSL。
MSDN还提供了Directx11顶点缓冲区的移植指南。 有人知道下面的代码如何遵循DFirectX9的MSDN规则:
MSDN指出: 翻转三角形顶点的顺序,以便Direct3D从前面顺时针遍历它们。例如,如果您的顶点在OpenGL管道中被索引为0、1和2,则将它们分别以0、2、1传递给Direct3D。 使用视图矩阵在z方向上按-1.0f缩放世界空间,从而有效地反转z轴坐标。为此,请翻转视图矩阵中位置M31,M32和M33处的值的符号(将其移植到Matrix类型时)。如果M34不为0,请同时翻转其符号。
问题: 我是否需要引入HLSL顶点着色器? 以下代码无需顶点着色器即可将数据获取到像素着色器中。.
struct Vertex { FLOAT x, y, z, rhw;
DWORD diffuse_color;
FLOAT u, v; };
#define MY_VERTEX_FORMAT (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1)
const int num_vertices = 4;
Vertex vertices[num_vertices] = {
0, 0, 0, 1, 0xFFFF0000, 0.0f, 0.0f, // left top
w, 0, 0, 1, 0xFFFF0000, 1.0f, 0.0f, // right top
w, h, 0, 1, 0xFFFF0000, 1.0f, 1.0f, // right bottom
0, h, 0, 1, 0xFFFF0000, 0.0f, 1.0f // left bottom };
.....
m_pD3DD9->SetPixelShader(pShader);
m_pD3DD9->BeginScene();
hr = m_pD3DD9->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
m_pD3DD9->EndScene();
…..
着色器:
sampler2D rgbaTexture : register(S0);
float4 main(float2 in_Point : TEXCOORD) : COLOR
{
…..
}
任何指导将不胜感激!
更新1
好,因此我需要指定一个右手视图和投影矩阵:
struct Vertex
{
FLOAT x, y, z;
FLOAT u, v;
};
...
->BeginScene()
D3DXMATRIX matView
D3DXVECTOR3 eye(2, 3, 3); //??
D3DXVECTOR3 Lat(0, 0, 0); //??
D3DXVECTOR3 up(0, 1, 0); //??
D3DXMatrixLookAtRH(&matView, &eye, &Lat, &up);
d3ddevice->SetTransform(D3DTS_VIEW, &matView);
D3DXMATRIX matProjection;
D3DXMatrixPerspectiveFovRH(&matProjection, D3DXToRadian(45.0f), float(SrcW / SrcH), 0.1f, 100.0f);
m_pD3DD9->SetTransform(D3DTS_PROJECTION, &matProjection);
要使这些矩阵起作用,需要向它们添加哪些数字,我希望像以前一样通过着色器但要使用右手坐标系来获得整个纹理?
答案
XMFLOAT4X4 matView;
XMFLOAT4X4 matProjection;
FXMVECTOR mEye = XMVectorSet(0.0f, 15.0f, -30.0f, 0.0f);
FXMVECTOR mAt = XMVectorSet(0.0f, 8.0f, 0.0f, 0.0f);
FXMVECTOR mUp = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
float fovInDegrees = 45.0f;
float aspectRatio = (float)m_SrcW / (float)m_SrcH;
float fovAngleY = fovInDegrees * XM_PI / 180.0f;
if (aspectRatio < 1.0f)
fovAngleY /= aspectRatio;
XMStoreFloat4x4(&matView, XMMatrixTranspose(XMMatrixLookAtRH(mEye, mAt, mUp)));
XMStoreFloat4x4(&matProjection, XMMatrixTranspose(XMMatrixPerspectiveFovRH(fovAngleY, aspectRatio, 0.01f, 125.0f)));
hr = m_pD3DD9->SetTransform(D3DTS_VIEW, reinterpret_cast<D3DXMATRIX*>(&matView));
hr = m_pD3DD9->SetTransform(D3DTS_PROJECTION, reinterpret_cast<D3DXMATRIX*>(&matProjection));