首页 > 解决方案 > GLSL-> DirectX9 HLSL 端口

问题描述

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

标签: glsldirectxdirectx-11hlsldirectx-9

解决方案


推荐阅读