Примитивная толщина - DX10 - PullRequest
       22

Примитивная толщина - DX10

2 голосов
/ 26 августа 2010

Я недавно перешел на примитивный рендеринг в 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 голосов
/ 11 октября 2011

Я нашел ту же проблему.В моем случае проблема заключалась в том, что сглаживание (подсчет нескольких семейств = 8 и multisampleQuality = 32) и флаг при растеризации:

D3D11_RASTERIZER_DESC rasterDesc;
rasterDesc.AntialiasedLineEnable = true;

С подсчетом = 1 и качеством = 8 работали нормально (ширина 1 пикселя для линии), но для строки 8/32 ширина стала 2 пикселя.

Я решил проблему с изменением rasterDesc.AntialiasedLineEnable на false.

Возможно, это будет работать для вас.

0 голосов
/ 27 августа 2010

Это странно. Я не понимаю, почему вы видите более 1 строки шириной в пиксель в игровом контексте (если у вас не установлен GS). D3D10_PRIMITIVE_TOPOLOGY_LINELIST состояние всегда создает линии шириной 1 пиксель, это спецификация.

Единственная причина, по которой линия может иметь ширину более одного пикселя, заключается в том, что у вас есть шейдер GS, который расширяет линию до четырехугольника или чего-то еще. Я уверен, что в игре где-то установлен геометрический шейдер.

...