如何设置着色器以在 dx11 中渲染一个具有颜色的对象和另一个具有纹理的对象?
how to set shader to render one object with color and another with texture in dx11?
在线教程几乎告诉我们用 color
或 texture
渲染对象,但没有人告诉我们是否要一个对象用颜色渲染,另一个用纹理渲染。就像下面的代码
struct VertexIn
{
float4 Pos : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 Pos : SV_POSITION;
float4 Color : COLOR;
};
或
struct VS_INPUT
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
};
那么我如何设置结构或 VS
和 PS
函数来渲染一个带有颜色的对象和另一个带有纹理的对象?更重要的是,我的项目使用 windows10 sdk。
最好的方法是使用"Instance Buffers"。这些与边顶点和索引缓冲区一起工作。您不仅可以为每个对象传递矩阵,还可以传递其他数据(例如浮点数),您可以使用它们来检查对象是否应该使用颜色或纹理。您需要将标志连同颜色和纹理坐标一起传递给像素着色器。该标志可以像附加到实例的附加浮点数一样简单。
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
float4 colour : COLOR;
float4 flags : POSITION1;
};
暂时用position1,记不清格式了,不过你应该用int而不是float,设置成[nointerpolation],查文档
在您的像素着色器中,您可以执行以下操作。
colourout.rgb = texturesample.rgb * flags.x + colour.rgb * (1 - flags.x);
然后您只需将顶点缓冲区中的 flags.x 设置为 0 或 1 或 2 的组合。
在线教程几乎告诉我们用 color
或 texture
渲染对象,但没有人告诉我们是否要一个对象用颜色渲染,另一个用纹理渲染。就像下面的代码
struct VertexIn
{
float4 Pos : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 Pos : SV_POSITION;
float4 Color : COLOR;
};
或
struct VS_INPUT
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
};
那么我如何设置结构或 VS
和 PS
函数来渲染一个带有颜色的对象和另一个带有纹理的对象?更重要的是,我的项目使用 windows10 sdk。
最好的方法是使用"Instance Buffers"。这些与边顶点和索引缓冲区一起工作。您不仅可以为每个对象传递矩阵,还可以传递其他数据(例如浮点数),您可以使用它们来检查对象是否应该使用颜色或纹理。您需要将标志连同颜色和纹理坐标一起传递给像素着色器。该标志可以像附加到实例的附加浮点数一样简单。
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
float4 colour : COLOR;
float4 flags : POSITION1;
};
暂时用position1,记不清格式了,不过你应该用int而不是float,设置成[nointerpolation],查文档
在您的像素着色器中,您可以执行以下操作。
colourout.rgb = texturesample.rgb * flags.x + colour.rgb * (1 - flags.x);
然后您只需将顶点缓冲区中的 flags.x 设置为 0 或 1 或 2 的组合。