Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用几何体着色器指向四边形展开_C++_Directx 11 - Fatal编程技术网

C++ 使用几何体着色器指向四边形展开

C++ 使用几何体着色器指向四边形展开,c++,directx-11,C++,Directx 11,我是几何体着色器的新手,所以我正在尝试制作一个几何体着色器,它将获取一个点并创建一个具有纹理坐标的四边形,作为一个示例来查看几何体着色器的工作原理。以下是我编写的代码: Texture2D txDiffuse : register( t0 ); SamplerState samAnisotropic { Filter = ANISOTROPIC; MaxAnisotropy = 4; }; cbuffer cbFixed { // // Compute text

我是几何体着色器的新手,所以我正在尝试制作一个几何体着色器,它将获取一个点并创建一个具有纹理坐标的四边形,作为一个示例来查看几何体着色器的工作原理。以下是我编写的代码:

Texture2D txDiffuse : register( t0 );
SamplerState samAnisotropic
{
    Filter = ANISOTROPIC;
    MaxAnisotropy = 4;
};

cbuffer cbFixed
{
    //
    // Compute texture coordinates to stretch texture over quad.
    //

    float2 gTexC[4] = 
    {
        float2(0.0f, 1.0f),
        float2(0.0f, 0.0f),
        float2(1.0f, 1.0f),
        float2(1.0f, 0.0f)
    };
};

cbuffer ConstantBuffer : register( b0 )
{
    matrix World;
    matrix View;
    matrix Projection;
}
struct VS_INPUT
{
    float3 Pos : POSITION;
};

struct VertexOut
{
    float3 Pos : POSITION;
};

struct GeoOut
{
    float4 PosH    : SV_POSITION;
    float2 Tex     : TEXCOORD;
    uint   PrimID  : SV_PrimitiveID;
};

VertexOut VS( VS_INPUT input )
{
    VertexOut output;

    output.Pos = input.Pos;

    return output;
}

[maxvertexcount(4)]
void GS(point VertexOut gin[1], uint primID : SV_PrimitiveID, inout TriangleStream<GeoOut> tristream)
{
    float4 v[4];
    v[0] = float4(gin[0].Pos + float3(1.0f, -1.0f, 0.0f), 1.0f);
    v[1] = float4(gin[0].Pos + float3(1.0f, 1.0f, 0.0f), 1.0f);
    v[2] = float4(gin[0].Pos + float3(-1.0f, -1.0f, 0.0f), 1.0f);
    v[3] = float4(gin[0].Pos + float3(-1.0f, 1.0f, 0.0f), 1.0f);

    GeoOut gout;
    [unroll]
    for (int i = 0; i < 4; i++)
    {
        gout.PosH = mul(v[i], World);
        gout.PosH = mul(v[i], View);
        gout.PosH = mul(v[i], Projection);
        gout.Tex = gTexC[i];
        gout.PrimID = primID;

        tristream.Append(gout);
    }
}

float4 PS( GeoOut input) : SV_Target
{
    //return txDiffuse.Sample( samAnisotropic, input.Tex );
    return float4( 1.0f, 1.0f, 1.0f, 1.0f );
}
Texture2D txDiffuse:寄存器(t0);
非均质性
{
滤波器=各向异性;
最大各向异性=4;
};
cbuffer cbFixed
{
//
//计算纹理坐标以在四边形上拉伸纹理。
//
浮动2 gTexC[4]=
{
浮动2(0.0f,1.0f),
浮动2(0.0f,0.0f),
浮动2(1.0f,1.0f),
浮动2(1.0f,0.0f)
};
};
cbuffer ConstantBuffer:寄存器(b0)
{
矩阵世界;
矩阵视图;
矩阵投影;
}
结构与输入
{
浮动3位:位置;
};
结构顶点输出
{
浮动3位:位置;
};
结构GeoOut
{
浮动4豪华:SV_位置;
浮动2 Tex:TEXCOORD;
uint-primitid:SV_-primitid;
};
顶点输出VS(VS_输入)
{
垂直输出;
output.Pos=input.Pos;
返回输出;
}
[maxvertexcount(4)]
void GS(点顶点输出gin[1],uint基元ID:SV_基元ID,输入非三角形流三流)
{
4 v[4];
v[0]=float4(gin[0]。Pos+float3(1.0f,-1.0f,0.0f),1.0f);
v[1]=float4(gin[0]。Pos+float3(1.0f,1.0f,0.0f),1.0f);
v[2]=float4(gin[0]。位置+float3(-1.0f,-1.0f,0.0f),1.0f);
v[3]=float4(gin[0]。Pos+float3(-1.0f,1.0f,0.0f),1.0f);
痛风;
[展开]
对于(int i=0;i<4;i++)
{
gout.PosH=mul(v[i],世界);
gout.PosH=mul(v[i],视图);
痛风PosH=mul(v[i],投影);
痛风Tex=gTexC[i];
gout.PrimID=PrimID;
痛风;
}
}
浮动4 PS(GeoOut输入):SV_目标
{
//返回txDiffuse.Sample(samAnisotropic,input.Tex);
返回浮动4(1.0f、1.0f、1.0f、1.0f);
}

当我编译这段代码时,我得到一个空白屏幕。起初我认为这可能是一个纹理问题,所以我尝试将像素着色器输出为白色,但没有帮助。下一步,我认为它可能不会显示,因为三角形的方式是伤口,所以我禁用背面剔除,但它仍然没有帮助。我不知道下一步该试什么。关于这个问题有什么想法吗?

我从未使用过几何体着色器,但我认为你计算痛风的方式是错误的。应该是

float4 p = mul(v[i], World);
       p = mul(p, View);
       p = mul(p, Projection);
gout.PosH = p;

看你哪里出错了?希望这能有所帮助。

我从未使用过几何体着色器,但我认为您计算痛风的方式是错误的。应该是

float4 p = mul(v[i], World);
       p = mul(p, View);
       p = mul(p, Projection);
gout.PosH = p;

看你哪里出错了?希望这能有所帮助。

我从未使用过几何体着色器,但我认为您计算痛风的方式是错误的。应该是

float4 p = mul(v[i], World);
       p = mul(p, View);
       p = mul(p, Projection);
gout.PosH = p;

看你哪里出错了?希望这能有所帮助。

我从未使用过几何体着色器,但我认为您计算痛风的方式是错误的。应该是

float4 p = mul(v[i], World);
       p = mul(p, View);
       p = mul(p, Projection);
gout.PosH = p;

看你哪里出错了?希望这能有所帮助。

哇,修好了,谢谢!我不敢相信我没有看到那个错误。我复制了我的顶点着色器代码并编辑了一点,所以我认为它是正确的。哇,修复了它,谢谢!我不敢相信我没有看到那个错误。我复制了我的顶点着色器代码并编辑了一点,所以我认为它是正确的。哇,修复了它,谢谢!我不敢相信我没有看到那个错误。我复制了我的顶点着色器代码并编辑了一点,所以我认为它是正确的。哇,修复了它,谢谢!我不敢相信我没有看到那个错误。我复制了我的顶点着色器代码并对其进行了一点编辑,所以我假设它是正确的。请记住,几何体着色器需要10.0+硬件。请记住,几何体着色器需要10.0+硬件。请记住,几何体着色器需要10.0+硬件。请记住,几何体着色器需要10.0+硬件。