2010-08-26 62 views
2

我最近在directX10中進入了原始渲染階段。我需要這樣做,因爲我想將我的遊戲聊天從directx9轉換爲10,因爲我的巨大性能滯後於遊戲的弱dx9支持。這些線條在我想要的位置上表現得很好。我的實際問題是,它們不像直接X9(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); 
} 

我的效果叛逆連隊2的輸出

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()));" 
" }" 
"}"; 

例在最高設置下運行在窗口模式下(也嘗試使用AA關閉時最低)

+0

你想要固定屏幕寬度的3D線嗎? (比如用glLineWidth命令) – Stringer 2010-08-26 15:18:00

+0

我想畫2D。 DX9工作正常,1px的細線: http://img828.imageshack.us/img828/8417/lolwf.png DX10是我的問題,而不是一個PX細線: HTTP://img828.imageshack。 us/img828/346/screenshotvg.png – Frank 2010-08-26 15:27:03

+0

我測試了我的DX10測試環境中的代碼。這些線條在那裏顯得很好。所以我很確定它的一些renderState或其他東西在遊戲環境中運行時強制該bug。 我試圖重置設備狀態 - > ClearnState()但沒有解決。 – Frank 2010-08-27 07:50:53

回答

0

這很奇怪。我不明白爲什麼你會在遊戲環境中看到多於1個像素寬的線條(如果你沒有設置GS)。 D3D10_PRIMITIVE_TOPOLOGY_LINELIST狀態總是產生1個像素寬的線,這就是規範。

一行可能超過一個像素寬度的唯一原因是因爲您有一個GS着色器,將一條線擴展爲四邊形或其他。我很確定遊戲在某處設置了幾何着色器。

+0

這可能是可能的。在我的代碼中,我將GeometryShader設置爲NULL,所以遊戲預設GS如何影響我的代碼? 這就是我如何初始化我Inputlayout和東西: http://privatepaste.com/f6ea42a721/oijoiggggg 正如你在我的繪製函數在這個線程我總是將我自己EffectPass的頂部看到。這不包括任何GS – Frank 2010-08-27 09:22:42

+0

我不知道這是怎麼發生的!您是否嘗試使用PIX調試狀態?我會先做。只是爲了確保我正朝着正確的方向前進。 – Stringer 2010-08-27 10:02:20

+0

我該怎麼做? – Frank 2010-08-27 10:12:55

0

我發現了同樣的問題。 在我的情況下的問題是抗混疊(multisamle計數= 8 & multisampleQuality = 32)&標誌在柵格化:

D3D11_RASTERIZER_DESC rasterDesc; 
rasterDesc.AntialiasedLineEnable = true; 

隨着計數= 1個質量= 8的起作用行(第1個的像素寬度) ,但對於8/32行變成2像素寬度。

我解決了將rasterDesc.AntialiasedLineEnable更改爲false的問題。

也許它適用於你。