glsl - 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));
解决方案
推荐阅读
- go - 使用 io.ReadFull 从 TCP 连接连续读取数据
- javascript - 相对 URL 不适用于 express-http-proxy
- vba - 在 Windows 10 上访问 2007 Word 自动化
- python - np.sum() 执行了多少次加法运算?
- java - 将数据对象从 xml 发送到 viewmodel
- c++ - 您可以在具有自定义类型的向量上应用 binary_search 吗?
- python - Requests.get() 在第一次运行时返回正确的数据,然后返回 html 代码
- mediawiki - Mediawiki:在服务器上打开本地文件的链接不起作用
- javascript - 如何根据值在谷歌柱形图中分配自定义颜色(Django)
- arrays - 无法展平 NumPy ndarray/如何更智能地读取二进制文件