C++ 向着色器传递值时出现问题

C++ 向着色器传递值时出现问题,c++,directx,shader,hlsl,direct3d10,C++,Directx,Shader,Hlsl,Direct3d10,将值传递到着色器时出现问题。我的应用程序编译得很好,但我的多维数据集对象不会着色。下面是我的大部分代码 我与着色器通信的大部分代码都在createObject方法中 myGame.cpp “我的立方体对象不会着色”到底是什么意思?最后的颜色是什么?白色的 从你的帖子来看,有些东西看起来不对劲。首先,定义光矢量的方式: D3DXVECTOR3 vLight(10.0f, 10.0f, 10.0f); 这是错误的,因为它不是规范化的,必须是(无论是在HLSL还是C++代码中),否则点积是没有意义的

将值传递到着色器时出现问题。我的应用程序编译得很好,但我的多维数据集对象不会着色。下面是我的大部分代码

我与着色器通信的大部分代码都在createObject方法中

myGame.cpp
“我的立方体对象不会着色”到底是什么意思?最后的颜色是什么?白色的

从你的帖子来看,有些东西看起来不对劲。首先,定义光矢量的方式:

D3DXVECTOR3 vLight(10.0f, 10.0f, 10.0f);

这是错误的,因为它不是规范化的,必须是(无论是在HLSL还是C++代码中),否则点积是没有意义的(参见)。您还可以使用已经规范化的向量,如:

[-0.577f,0.577f,-0.577f]
[0.0f,0.0f,-1.0f]
并且不关心标准化

第二件事,在
VS
中,您不会根据世界矩阵变换顶点法线。这是不好的,尤其是如果您的灯光方向已在世界空间中定义,并且立方体法线保留在模型空间中。 这可能不是造成阴影效果不好的原因,但重要的是你不能对属于不同空间的向量进行数学运算

第三点是C++方块代码,初始化立方体颜色(我找不到它,以及Valice位置)。在我看来,您的代码的体系结构很糟糕,因为每个属性至少应该在同一个

CreateObject
函数中初始化

关于着色器编码样式,我建议如下声明
PS\u INPUT

struct PS_INPUT
{
    float4 Pos : SV_Position;
    float4 Col : TEXCOORD0;
    float3 Norm : TEXCOORD1;
};

因此,在
颜色
SV_目标
之间没有混淆。所有非
SV.*
属性都应该使用
TEXCOORDN

您所说的“我的立方体对象不会着色”到底是什么意思?最后的颜色是什么?白色的

从你的帖子来看,有些东西看起来不对劲。首先,定义光矢量的方式:

D3DXVECTOR3 vLight(10.0f, 10.0f, 10.0f);

这是错误的,因为它不是规范化的,必须是(无论是在HLSL还是C++代码中),否则点积是没有意义的(参见)。您还可以使用已经规范化的向量,如:

[-0.577f,0.577f,-0.577f]
[0.0f,0.0f,-1.0f]
并且不关心标准化

第二件事,在
VS
中,您不会根据世界矩阵变换顶点法线。这是不好的,尤其是如果您的灯光方向已在世界空间中定义,并且立方体法线保留在模型空间中。 这可能不是造成阴影效果不好的原因,但重要的是你不能对属于不同空间的向量进行数学运算

第三点是C++方块代码,初始化立方体颜色(我找不到它,以及Valice位置)。在我看来,您的代码的体系结构很糟糕,因为每个属性至少应该在同一个

CreateObject
函数中初始化

关于着色器编码样式,我建议如下声明
PS\u INPUT

struct PS_INPUT
{
    float4 Pos : SV_Position;
    float4 Col : TEXCOORD0;
    float3 Norm : TEXCOORD1;
};

因此,在
颜色
SV_目标
之间没有混淆。所有非
SV_*
属性都应该使用
TEXCOORDN

我刚才确实解决了这个问题。主要问题是正常化。你说得对。关于模型空间中的法线也是正确的。当我尝试旋转立方体时,所有边上的边都保持着色,这向我表明法线仍保留在模型空间中。如果你不介意的话,我的后续问题。因为我仍在试图弄明白这是我可以用投影空间乘以法线吗?或者我只需要用世界空间乘以法线。我想我必须把它乘以世界空间。下一步我要试一试,你不用一个向量乘以一个“空间”,而是一个变换矩阵,它从一个输入空间得到一个向量,然后产生一个属于一个输出空间的新向量。通常,顶点通过WVP矩阵(世界视图投影连接矩阵)进行变换,从而在投影空间或更精确的剪裁空间中结束。光栅化步骤执行w分割,即透视分割,并将顶点转换为NDC空间(-1您可以使用世界矩阵变换(不要忘记使用0.0f初始化w坐标,因为它是向量而不是点)。但请注意,这在一般情况下并不准确。例如,您的3D网格上有一个缩放矩阵。在这种情况下,通常需要一个反向转置WV矩阵,我让您找出原因。但请记住,对于法线变换,您不局限于特定的空间。这完全取决于您不想要的空间的开发人员o进行照明计算。例如,你可以在切线空间中工作。我不久前确实解决了这个问题。主要问题是规范化。你在这方面是对的。关于模型空间中的法线也是对的。当我尝试旋转立方体时,所有边上的边都保持着色,这向我表明t法线还留在模型空间中。如果你不介意的话,我接下来的问题是。因为我仍在试图弄清楚这个问题是…“我能用投影空间乘以法线吗?或者我只需要用世界空间乘以法线。我想我必须用世界空间乘以法线。我下一步要试一试。你不能乘以向量tor是一个“空间”,但它是一个变换矩阵,从一个输入空间获取一个向量,并生成一个属于输出空间的新向量。通常顶点由WVP矩阵(世界视图投影串联矩阵)变换因此最终会进入投影空间,或者更准确地说是剪裁空间。光栅化步骤执行w分割,即透视分割,并将顶点转换到NDC空间(-1您可以使用世界矩阵变换(不要忘记用0.0f初始化w坐标,因为它是向量而不是点)。但请注意,在一般情况下,这并不准确。例如,3D网格上有一个缩放矩阵。在这些情况下,通常需要反向转置WV矩阵