c++ - DirectX Clip 空间纹理坐标

标签 c++ directx textures hlsl

好的,首先我正在使用:

  • DirectX 10
  • C++

好吧,这对我来说有点奇怪,我通常不会问这个问题,但我被环境所迫。我有两个三角形(不是四边形,因为我不会进入!)全屏,通过它们没有转换的事实与屏幕对齐。

在 DirectX 顶点声明中,我传递了一个 3 分量 float (Pos x,y,z) 和 2 个分量 float (Texcoord x,y)。 Texcoord z 是为 texture2d 数组保留的,我目前在像素着色器中默认为 0。

我写这个是为了完成简单的任务:

float fStartX = -1.0f;
float fEndX = 1.0f;
float fStartY = 1.0f;
float fEndY = -1.0f;
float fStartU = 0.0f;
float fEndU = 1.0f;
float fStartV = 0.0f;
float fEndV = 1.0f;
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fStartY, 0, fEndU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV));
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV));
vmvUIVerts.push_back(CreateVertex(fStartX, fEndY, 0, fStartU, fEndV));

IA 布局:(更新)

D3D10_INPUT_ELEMENT_DESC ieDesc[2] = {
    { "POSITION",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0,12, D3D10_INPUT_PER_VERTEX_DATA, 0 }
};

数据以下列格式到达顶点着色器:(更新)

struct VS_INPUT
{ 
    float3 fPos          :POSITION;
    float3 fTexcoord     :TEXCOORD0;
}

在我的顶点和像素着色器中,对于这个特定的绘制调用并没有发生太多事情,像素着色器使用指定的 UV 坐标从纹理中进行大部分采样。然而,这并没有像预期的那样工作,似乎我得到了采样纹理的只有 1 个像素

解决方法是在像素着色器中执行以下操作:(更新)

sampler s0                      : register(s0);
Texture2DArray<float4> meshTex  : register(t0);
float4 psMain(in VS_OUTPUT vOut) : SV_TARGET
{
    float4 Color;
    vOut.fTexcoord.z = 0;
    vOut.fTexcoord.x = vOut.fPosObj.x * 0.5f;
    vOut.fTexcoord.y = vOut.fPosObj.y * 0.5f;
    vOut.fTexcoord.x += 0.5f;
    vOut.fTexcoord.y += 0.5f;
    Color = quadTex.Sample(s0, vOut.fTexcoord);
    Color.a = 1.0f;
    return Color;
}

还值得注意的是,这适用于着色器中定义的以下 VS out 结构:

struct VS_OUTPUT
{
    float4 fPos          :POSITION0; // SV_POSITION wont work in this case
    float3 fTexcoord    :TEXCOORD0;
}

现在我有一个纹理被拉伸(stretch)以适合整个屏幕,两个三角形都已经覆盖了它,但为什么纹理 UV 没有按预期使用?

澄清一下,我使用的是点采样器,并尝试了夹紧和包裹 UV。

我有点好奇并找到了上面提到的解决方案/解决方法,但是如果有人知道为什么会发生,我宁愿不必这样做?

最佳答案

您为顶点类型指定的语义是什么?它们是否与您的顶点和着色器正确对齐?如果您使用的是 D3DXVECTOR4、D3DXVECTOR3 设置(如您的 VS 代码中所示),如果您的 CreateVertex() 返回 D3DXVECTOR3、D3DXVECTOR2 结构,则这可能是个问题。 也能看到您的像素着色器代码会让您安心。

关于c++ - DirectX Clip 空间纹理坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9422217/

相关文章:

java - 试图解压缩 BC1 纹理压缩的扰乱 block

ios - 解除绑定(bind) Open GL ES 纹理的正确方法?

C++ 常量赋值

C++ class property setter getter Macro vs 模板

c++ - 替换已弃用的 DirectSound 的选项

c++ - 在 DirectX 项目中正确设置 MMDevice

c++ - 使用 STBI_Image OpenGL 加载图像时在 0x69ABF340 抛出异常

c++ - 初始化 vector 的 vector ,其中并非所有 vector 的大小都相同 C++

c# - 字典查找与数组查找;数组分配与字典分配

C# - 无法解析 DirectX SDK 中的 XInput 命名空间(2008 年 11 月)