GLSL-> DirectX9 HLSL端口

时间:2019-01-11 13:07:51

标签: glsl directx directx-11 hlsl directx-9

我有一个从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));

0 个答案:

没有答案