2017-07-19 20 views
1

私のプログラムの問題をピンポイントで指摘する人がいれば、私は不思議に思っていました。私は、後退はデータがGSを通過する方法と関係があることを確信しています。たとえば、ジオメトリシェーダがコードから取り出された場合(変更に対応するために他の2つのステージを変更する場合)、私は操作上のパイプラインになります。 VS_DATAの代わりにPS_INPUTを受け入れるようにGSのデータ入力を変更すると、プログラムはクラッシュせず、空のブルースクリーンを出力します。私のここでの目的は、二次元平面上に四角形のコレクションを作成することです。そのため、空の青いスクリーンは、私が行っているものではありません。ジオメトリシェーダの入力と出力

Texture2D txDiffuse[26] : register(t0); 
SamplerState samLinear : register(s0); //For Texturing 

#define AWR_MAX_SHADE_LAY 1024 

cbuffer ConstantBuffer : register(b0) 
{ 
    float4 Matrix_Array[30]; 
    matrix Screen; 
    float GM; 
    float GA; 
    float GD; 
    float epsilon; 
} 
// Includes Layer Data 
cbuffer CBLayer : register(b1) 
{ 
    float4 Array_Fill_Color[AWR_MAX_SHADE_LAY]; 
    float4 Array_Line_Color[AWR_MAX_SHADE_LAY]; 
    float Array_Width[AWR_MAX_SHADE_LAY]; 
    float Array_Line_Pattern[AWR_MAX_SHADE_LAY]; 
    float Array_Z[AWR_MAX_SHADE_LAY]; 
    float Array_Thickness[AWR_MAX_SHADE_LAY]; 
} 

//Input for Vertex Shader 
struct VS_DATA 
{ 
    float4 Pos : POSITION; 
    int M2W_index : M2W_INDEX; 
    int Layer_index : LAYER_INDEX; 
}; 

//Input for Pixel Shader 
struct PS_INPUT{ 
    float4 Pos : SV_POSITION; 
    float4 Color : COLOR; 
    int Layer_index : LAYER_INDEX; 
}; 

//Vertex Shader 
VS_DATA VS(VS_DATA input)// Vertex Shader 
{ 
    VS_DATA output = (VS_DATA)0; 
    //Model to World Transform 
    float xm = input.Pos.x, yw = input.Pos.y, zm = input.Pos.z, ww = input.Pos.w, xw, zw; 
    float4 transformation = Matrix_Array[input.M2W_index]; 
    xw = ((xm)*transformation.y - (zm)*transformation.x) + transformation.z; 
    zw = ((xm)*transformation.x + (zm)*transformation.y) + transformation.w; 

    //set color 
    int valid_index = input.Layer_index; 
    output.Color = Array_Fill_Color[valid_index]; 
    output.Color.a = 0.0; 

    //output.Vertex_index = input.Vertex_index; 
    //output.Next_Vertex_index = input.Next_Vertex_index; 

    //Snapping process 
    float sgn_x = (xw >= 0) ? 1.0 : -1.0;     
    float sgn_z = (zw >= 0) ? 1.0 : -1.0; 
    int floored_x = (int)((xw + (sgn_x*GA) + epsilon)*GD); 
    int floored_z = (int)((zw + (sgn_z*GA) + epsilon)*GD); 
    output.Pos.x = ((float)floored_x)*GM; 
    output.Pos.y = yw; 
    output.Pos.z = ((float)floored_z)*GM; 
    output.Pos.w = ww; 

    int another_valid_index = input.Layer_index; 
    output.Layer_index = another_valid_index; 

    // Transform to Screen Space 
    output.Pos = mul(output.Pos, Screen); 

    return output; 
} 


[maxvertexcount(6)] 
void GS_Line(line VS_DATA points[2], inout TriangleStream<PS_INPUT> output) 
{ 
    float4 p0 = points[0].Pos; 
    float4 p1 = points[1].Pos; 

    float w0 = p0.w; 
    float w1 = p1.w; 

    p0.xyz /= p0.w; 
    p1.xyz /= p1.w; 

    float3 line01 = p1 - p0; 
    float3 dir = normalize(line01); 

    float3 ratio = float3(700.0, 0.0, 700.0); 
    ratio = normalize(ratio); 

    float3 unit_z = normalize(float3(0.0, -1.0, 0.0)); 

    float3 normal = normalize(cross(unit_z, dir) * ratio); 
    float width = 0.01; 

    PS_INPUT v[4]; 

    float3 dir_offset = dir * ratio * width; 
    float3 normal_scaled = normal * ratio * width; 

    float3 p0_ex = p0 - dir_offset; 
    float3 p1_ex = p1 + dir_offset; 

    v[0].Pos = float4(p0_ex - normal_scaled, 1) * w0; 
    v[0].Color = float4(1.0, 1.0, 1.0, 1.0); 
    v[0].Layer_index = 1; 

    v[1].Pos = float4(p0_ex + normal_scaled, 1) * w0; 
    v[1].Color = float4(1.0, 1.0, 1.0, 1.0); 
    v[1].Layer_index = 1; 

    v[2].Pos = float4(p1_ex + normal_scaled, 1) * w1; 
    v[2].Color = float4(1.0, 1.0, 1.0, 1.0); 
    v[2].Layer_index = 1; 

    v[3].Pos = float4(p1_ex - normal_scaled, 1) * w1; 
    v[3].Color = float4(1.0, 1.0, 1.0, 1.0); 
    v[3].Layer_index = 1; 

    output.Append(v[2]); 
    output.Append(v[1]); 
    output.Append(v[0]); 

    output.RestartStrip(); 

    output.Append(v[3]); 
    output.Append(v[2]); 
    output.Append(v[0]); 

    output.RestartStrip(); 
} 

//Pixel Shader 
float4 PS(PS_INPUT input) : SV_Target{ 
    float2 Tex = float2(input.Pos.x/(8.0), input.Pos.y/(8.0)); 
    int the_index = input.Layer_index; 

    float4 tex0 = txDiffuse[25].Sample(samLinear, Tex); 
     if (tex0.r > 0.0) 
      tex0 = float4(1.0, 1.0, 1.0, 1.0); 
     else 
      tex0 = float4(0.0, 0.0, 0.0, 0.0); 
    if (tex0.r == 0.0) 
     discard; 
    tex0 *= input.Color; 
    return tex0; 
} 
+0

Direct3Dから '' HRESULT''エラーが発生しましたか?デバッグデバイスを有効にして、デバッグウィンドウで出力を探しましたか? Direct3Dハードウェア機能レベルが10.0以上のカードを使用していますか?また、Geometry Shader(10.0以上のハードウェアが必要)を使用しているので、26個のテクスチャをバインドするのではなく、 "Texture2DArray"(10.0以上のハードウェアが必要です)を使用することを検討する必要があります。 –

+0

プログラムはこのステップ 'ID3DBlob * pVSBlob = nullptr; \t hr = CompileShaderFromFile(L "Tutorial07.fx"、 "VS"、 "vs_4_0"、&pVSBlob); (FAILED(時間)) \t { \t \tのMessageBox場合 \t(nullptr、L "FXファイルをコンパイルすることはできませんが。FXファイルを含むディレクトリからこの実行可能ファイルを実行してください。"、L "エラー"、MB_OK) ; \t \t return hr; \t} 'は、MSDNのチュートリアルのものです。エラーメッセージはL "の後のものです – NAKASSEIN

+0

このコード行はジオメトリシェーダではなく、頂点シェーダです。ジオメトリシェーダは" GS_Line "、" gs_4_0 "です。Visual Studioからシェーダを構築しようとしています開発者のコ​​マンドプロンプトを '' FXC.EXE''で直接実行すると、コンパイラのエラー出力をより簡単に見ることができます。 –

答えて

1

そのままあなたは頂点シェーダをコンパイルする場合、次のエラーがあります:

(ライン53):無効添字は '色'

output.Color = Array_Fill_Color[valid_index]; 

出力タイプVS_DATAであります色を含まない。次に、あなたの対コンパイルします

PS_INPUT VS(VS_DATA input)// Vertex Shader 
{ 
    PS_INPUT output = (PS_INPUT)0; 
    //rest of the code here 

が、その後、あなたはGSとの不一致のレイアウトを持つことになります(GSは、まだ入力としてVS_DATAのラインを期待して、今は提供:

として、あなたのVSの定義を変更した場合PS_INPUT) これはあなたが描画するまでエラーを出すことはありません(通常、ランタイムは自動的に失敗します。デバッグレイヤがオンの場合は不一致メッセージが表示されます)

したがって、GSを修正して受け入れる必要があります入力としてPS_INPUT:例:

[maxvertexcount(6)] 
void GS_Line(line PS_INPUT points[2], inout TriangleStream<PS_INPUT> output) 
+0

ありがとうございました!問題は、シェーダを介してデータを移動する方法でした。 – NAKASSEIN

関連する問題