2010-08-26 2 views
2

Я недавно вступил в примитивный рендеринг в directX10. Мне нужно это, потому что я хочу конвертировать мой игровой чат с directx9 на 10 из-за того, что мое огромное отставание в производительности было вызвано поддержкой слабых dx9 игр. Строки отображаются на позициях, которые я хочу. Моя фактическая проблема заключается в том, что они не кажутся такими же тонкими, как в directX9 (ширина 1 пиксель). Они кажутся более толстыми, чем пиксель. Я кое-что прочитал и нашел информацию о том, что ее можно исправить с помощью какого-то геометризованного шейдера. Кто-нибудь знает, как это будет работать и как это будет выглядеть разумно? Я не настолько глубоко погружен в это.Примитивная толщина - DX10

Прикрепленный метод DrawLine (инициализация разве нужен я верю, если так я выложу его immediliantly)

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)

+0

Вам нужны 3D-линии с фиксированной шириной экрана? (например, с командой glLineWidth) – Stringer

+0

Я хочу нарисовать 2D. DX9 работает отлично, 1px тонкие линии: http://img828.imageshack.us/img828/8417/lolwf.png DX10 моя проблема, а не один РХ тонкие линии: Http: //img828.imageshack. us/img828/346/screenshotvg.png – Frank

+0

Я протестировал код в тестовой среде DX10. Линии там выглядят хорошо. Поэтому я совершенно уверен, что его некоторые renderState или что-то еще заставляют эту ошибку работать в игровом контексте. Я попытался сбросить состояние устройств с помощью -> ClearnState(), но это не сработало. – Frank

ответ

0

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

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

+0

Это может быть возможно. В моем коде я устанавливаю GeometryShader равным NULL, так как могут ли игры, заданные GS повлиять на мой код? Вот как я INIT мой Inputlayout и прочее: http://privatepaste.com/f6ea42a721/oijoiggggg Как вы видите, в моей функции вытяжки в верхней части этой темы я всегда применяющим свой собственный EffectPass. И это не включает никаких GS – Frank

+0

Я не знаю, как это может случиться! Вы пытались отлаживать состояния с помощью PIX? Я бы сделал это первым. Просто чтобы убедиться, что я направляюсь в правильном направлении. – Stringer

+0

Как я могу это сделать? – Frank

0

Я нашел ту же проблему. В моем случае проблема была сглаживанием (multisamle счетчик = 8 & multisampleQuality = 32) & флаг в растеризации:

D3D11_RASTERIZER_DESC rasterDesc; 
rasterDesc.AntialiasedLineEnable = true; 

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

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

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