原始厚度 - DX10

时间:2010-08-26 13:54:30

标签: directx drawing primitive directx-10 drawing2d

我最近在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关闭时也已尝试最低)

2 个答案:

答案 0 :(得分:0)

这很奇怪。我不明白为什么你在游戏上下文中看到超过1个像素宽度的行(如果你没有GS设置)。 D3D10_PRIMITIVE_TOPOLOGY_LINELIST总是生成1条像素宽度的线,这就是规范。

线条可能超过一个像素宽度的唯一原因是因为您有一个GS着色器可以将线条扩展为四边形或其他任何内容。我很确定游戏在某个地方设置了几何着色器。

答案 1 :(得分:0)

我发现了同样的问题。 在我的情况下,问题是抗锯齿(多重数量= 8& multisampleQuality = 32)&光栅化中的标志:

D3D11_RASTERIZER_DESC rasterDesc;
rasterDesc.AntialiasedLineEnable = true;

使用count = 1和quality = 8工作正常(行的宽度为1像素),但8/32行变为2像素宽度。

我解决了将rasterDesc.AntialiasedLineEnable更改为false的问题。

也许它适合你。