【问题标题】:Primitive thickness - DX10原始厚度 - DX10
【发布时间】:2011-04-04 07:07:20
【问题描述】:

我最近开始在 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 关闭的情况下尝试最低)

【问题讨论】:

  • 您想要屏幕宽度固定的 3D 线条吗? (如使用 glLineWidth 命令)
  • 我想画 2D。 DX9 工作正常,1px 细线:img828.imageshack.us/img828/8417/lolwf.png DX10 是我的问题,没有一条 px 细线:img828.imageshack.us/img828/346/screenshotvg.png
  • 我已经在我的 DX10 测试环境中测试了代码。那里的线条看起来很好。所以我很确定它的某些 renderState 或其他东西在游戏环境中运行时会强制该错误。我尝试使用 ->ClearnState() 重置设备状态,但没有成功。

标签: directx drawing primitive directx-10 drawing2d


【解决方案1】:

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

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

【讨论】:

  • 这是可能的。在我的代码中,我将 GeometryShader 设置为 NULL 那么游戏预设 GS 如何影响我的代码?这就是我如何初始化我的 Inputlayout 和东西:privatepaste.com/f6ea42a721/oijoiggggg 正如你在这个线程顶部的绘制函数中看到的,我总是应用我自己的 EffectPass。这不包括任何GS
  • 我不知道怎么会这样!您是否尝试使用 PIX 调试状态?我会先这样做。只是为了确保我朝着正确的方向前进。
  • 检查一下:msdn.microsoft.com/en-us/library/ee418737(VS.85).aspx 选择单帧捕获(按 F12 捕获看到错误行的帧),然后分析捕获:)
  • 下班后试试。刚刚在这里得到了一个愚蠢的 mac book pro ^^ 我应该在这里发布结果还是你有一些即时通讯工具我可以抓住你。感谢您的帮助!
【解决方案2】:

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

D3D11_RASTERIZER_DESC rasterDesc;
rasterDesc.AntialiasedLineEnable = true;

count=1 和 quality=8 工作正常(线宽 1 像素),但 8/32 线宽变为 2 像素。

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

也许它对你有用。

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2021-12-09
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多