2

私は最近、directX10 でのプリミティブ レンダリングに足を踏み入れました。ゲーム内チャットを directx9 から 10 に変換したいので、これが必要です。これは、ゲームの弱い dx9 サポートによって大きなパフォーマンス ラグが発生するためです。必要な位置で線がきれいにレンダリングされています。私の実際の問題は、それらが directX9 (1 ピクセル幅) ほど薄く見えないことです。それらはピクセルよりも厚いようです。私はいくつかを読んで、ある種のジオメトリシェーダーでそれを修正できるという情報を見つけました。それがどのように機能し、コードがどのように見えるかを知っている人はいますか? 私はそこまで深くは考えていません。

drawLine メソッドが添付されています (初期化は必要ないと思います。そうであれば、すぐに投稿します)

 void drawLine(int x1, int y1, int x2, int y2, D3DCOLOR lineColor) {
  VERTEX Vertices[] = {
  /*p1*/{getScreenPercentage(x1, y1), lineColor}, //getScreenPercentage puts the given screencoords into the rasterized state
  /*p2*/{getScreenPercentage(x2, y2), lineColor}
  };

  pDevice->IASetInputLayout(pVertexLayout);
  UINT stride = sizeof(VERTEX);
  UINT offset = 0;
  pDevice->IASetVertexBuffers(0, 1, &p2pBuffer, &stride, &offset);

  VERTEX* pVoid;
  p2pBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&pVoid);
  pVoid[0] = Vertices[0];
  pVoid[1] = Vertices[1];
  p2pBuffer->Unmap();

  pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINELIST);
  pPass->Apply(0);
  pDevice->Draw(2, 0);
 }

そして私の効果

char szEffect[] = 
"struct DATA"
"{"
"    float4 Pos : SV_POSITION;"
"    float4 Color : COLOR;"
"};"

"DATA VS(float4 Pos : POSITION, float4 Col : COLOR)"
"{"
"    DATA Data;"
"    Data.Pos = Pos;"
"    Data.Color = Col;"
"    return Data;"
"}"

"float4 PS(DATA Data) : SV_TARGET"
"{"
"    return Data.Color;"
"}"

"technique10 T0"
"{"
"    pass P0"
"    {"
"        SetVertexShader(CompileShader(vs_4_0, VS()));"
"        SetGeometryShader(NULL);"
"        SetPixelShader(CompileShader(ps_4_0, PS()));"
"    }"
"}";

最高設定のウィンドウ モードで実行されている Bad Company 2 の出力の例 (AA をオフにして最低を試しました)

4

2 に答える 2

0

同じ問題が見つかりました。私の場合、問題はアンチエイリアシング (マルチサンプル カウント = 8 & マルチサンプル品質 = 32) & ラスタライズのフラグでした:

D3D11_RASTERIZER_DESC rasterDesc;
rasterDesc.AntialiasedLineEnable = true;

count=1 と quality=8 で問題なく動作しました (線の幅は 1 ピクセル) が、8/32 の線は 2 ピクセル幅になりました。

rasterDesc.AntialiasedLineEnable を false に変更して問題を解決しました。

多分それはあなたのために働くでしょう。

于 2011-10-11T16:59:35.827 に答える
0

これは奇妙です。ゲーム コンテキストで複数のピクセル幅の線が表示される理由がわかりません (GS が設定されていない場合)。D3D10_PRIMITIVE_TOPOLOGY_LINELISTstateは常に1 ピクセル幅の線を生成します。これが仕様です。

線が複数のピクセル幅になる可能性がある唯一の理由は、線をクワッドなどに拡張する GS シェーダーがあるためです。ゲームがジオメトリ シェーダーをどこかに設定したことは確かです。

于 2010-08-27T09:11:13.177 に答える