2011-05-12 23 views
6

मुझे जीडीआई और डी 3 डी 11 के साथ एक बनावट में एक पाठ खींचने के साथ कुछ मदद चाहिए। मैंने डी 2 डी/डायरेक्टवाइट का उपयोग करने की कोशिश की, लेकिन यह सिर्फ डी 3 डी 10 का समर्थन करता है और डी 3 डी 11 की आवश्यकता नहीं है। मैंने जो भी कोशिश की वह अब तक विफल रही है ... अब मैं बनावट में लिखने के लिए जीडीआई मेथोड का उपयोग करना चाहता हूं। तो मैं एक बनावट बनाई इस के साथ पैरामीटर:डी 3 डी 11: जीडीआईडीआई सतह पर जीडीआई टेक्स्ट कैसे आकर्षित करें? (डी 2 डी के बिना)

Usage = D3D11_USAGE_DEFAULT; 
Format = DXGI_FORMAT_B8G8R8A8_UNORM; 
BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; 
CPUAccessFlags = 0; 
MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE 

तो मैं माइक्रोसॉफ्ट sais यहाँ के रूप में इस बनावट से एक सामान्य RenderTargetView बनाया: http://msdn.microsoft.com/en-us/library/ff476203%28v=vs.85%29.aspx

अगला चरण:

m_pTexFSText->QueryInterface(__uuidof(IDXGISurface1), (void **)(&m_pDXGISurface)); 
: DXGI इंटरफ़ेस जाओ

रेंडर फ़ंक्शन पर मैं बस यह करता हूं:

m_pDeviceContext->OMSetRenderTargets(1,&m_pTextRenderTarget,NULL); 

HDC hDc = NULL; 
if(FAILED(m_pDXGISurface->GetDC(TRUE,&hDc))) 
    return E_FAIL; 

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255)); 
bool hmm = TextOutA(hDc, 10, 10, "LALALA!", 7); 

if(FAILED(m_pDXGISurface->ReleaseDC(NULL))) 
    return E_FAIL; 

समस्या यह है कि उस जीडीआई ड्राइंग के बाद बनावट अभी भी खाली है (पीईक्स के साथ भी परीक्षण किया गया है)। सब कुछ काम करता है और कोई त्रुटि संदेश नहीं हैं।

मुझे आशा है कि कोई भी यह समझा सकता है कि यह कैसे काम करता है।

धन्यवाद, स्टीफन

संपादित करें: (प्रलेखन के अनुसार) भी यह कोशिश की GetDC(FALSE,&hDc) साथ: एक ही परिणाम -> कुछ भी नहीं।

+0

क्या आपने 'DXGI_FORMAT_R8G8B8A8_UINT' के प्रारूप का प्रयास किया है? – Necrolis

+0

एक GDI संगत बनावट ऊपर के लिंक पर दस्तावेज के अनुसार की जरूरत है विशेष प्रारूपों "आप निम्नलिखित प्रकार से एक के लिए बनावट प्रारूप सेट करना होगा: DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_TYPELESS, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB" – sandicz

उत्तर

3

शायद आप सबकुछ ठीक कर रहे हैं, यह सिर्फ टेक्स्ट ड्राइंग आपकी अपेक्षाओं को नहीं करता है?

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255)); 
bool hmm = TextOutA(hDc, 10, 10, "LALALA!", 7); 

मैं इस से समझ में नहीं आता है आप कैसे उम्मीद करते हैं कि TextOutA लगता होगा कि bla पाठ रंग के रूप में इस्तेमाल किया जाना चाहिए। AFAIK नए बनाए गए/प्राप्त डीसी में उपयोग किए गए डिफ़ॉल्ट टेक्स्ट रंग का काला है। पृष्ठभूमि भरने के तरीके के बारे में निश्चित नहीं है, लेकिन यदि यह डिफ़ॉल्ट रूप से TRANSPARENT है - यह पूरी तरह बताता है कि क्यों कुछ भी चित्रकारी नहीं कर रहा है।

मैं निम्नलिखित करने के लिए अपने कोड को बदल देंगे:

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255)); 
VERIFY(SetTextColor(hDc, bla) != CLR_INVALID); 

CREct rc(0, 0, 30, 20); // put relevant coordinates 
VERIFY(ExtTextOut(hDc, rc.left, rc.top, ETO_CLIPPED, &rc, "LALALA!", 7)); 
+0

हाय, इन पंक्तियों सिर्फ परीक्षण कर रहे हैं। पिक्सेल को 1,1 से सफेद पर सेट करें और दूसरी बार डेमो टेक्स्ट लिखें। मैं आपके संस्करण का प्रयास करूंगा। धन्यवाद :) – sandicz

+0

मैंने अभी देखा है कि मुझे GetDC() फ़ंक्शन पर एक त्रुटि संदेश मिल रहा है: "माइक्रोसॉफ्ट सी ++ - अपवाद: स्मृति स्थिति 0x0018f760 पर _com_error" (अंग्रेज़ी में अनुवादित)। मैं वास्तव में कल्पना नहीं कर सकता कि ऐसा क्यों होता है। शायद यह मुख्य समस्या है और जीडीआई नहीं है। ऐसा लगता है कि जब तक DirectWrite D3D11 का समर्थन नहीं करता है तब तक मुझे प्रतीक्षा करने की आवश्यकता है ... – sandicz

+0

हाँ, वापसी मूल्य/अपवादों की जांच करना एक अच्छा विचार है, खासकर यदि कुछ गलत है :) – valdo

4

मैं वास्तव में इस समस्या को एक बहुत पिछले सप्ताह के दौरान लड़े - लेकिन मुझे मिल गया है यह सब काम कर! यहाँ चीज़ों की सूची आपको पता होना चाहिए है/यह सब काम करने के लिए कार्य करें:

तथ्यों का ध्यान रखें जब में निम्नलिखित इस विधि का उपयोग:

• आपको सतह के लिए D3D11_RESOURCE_MISC_GDI_COMPATIBLE ध्वज का उपयोग करके या स्वैप श्रृंखलाओं के लिए DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE ध्वज का उपयोग करके सतह बनाना होगा, अन्यथा यह विधि विफल हो जाती है।

• आपको डिवाइस को रिलीज़ करना होगा और IDXGISurface1 :: रिलीज डीसी विधि को किसी नए डायरेक्ट 3 डी कमांड जारी करने से पहले कॉल करना होगा।

• यह विधि विफल हो जाती है यदि इस विधि द्वारा एक उत्कृष्ट डीसी पहले ही बनाया जा चुका है।

• सतह या स्वैप श्रृंखला के लिए प्रारूप DXGI_FORMAT_B8G8R8A8_UNORM_SRGB या DXGI_FORMAT_B8G8R8A8_UNORM होना चाहिए।

• गेटडीसी पर, डायरेक्ट 3 डी पाइपलाइन के आउटपुट विलय में रेंडर लक्ष्य सतह से अनबाउंड है। जीडीआई प्रतिपादन के बाद आपको Direct3D प्रतिपादन से पहले डिवाइस पर ID3D11DeviceContext :: OMSetRenderTargets विधि को कॉल करना होगा।

• बफर का आकार बदलने से पहले आपको सभी उत्कृष्ट डीसी जारी करना होगा।

  • तुम वापस बफर में इसका इस्तेमाल करने जा रहे हैं, फिर से बाँध के लिए याद आप ReleaseDC कहा जाता करने के बाद लक्ष्य प्रस्तुत करना। GetDC को कॉल करने से पहले आरटी को मैन्युअल रूप से अनइंड करने के लिए यह आवश्यक नहीं है क्योंकि यह विधि आपके लिए यह करती है।

  • आप GetDC() और ReleaseDC() के रूप में सतह excusively GDI के लिए DXGI द्वारा अवरोधित किया गया है कॉल के बीच किसी भी Direct3D ड्राइंग का उपयोग नहीं कर सकते हैं। हालांकि आप जीडीआई और डी 3 डी प्रतिपादन को मिश्रित कर सकते हैं बशर्ते कि आप डीडीडी पर जाने से पहले जीडीआई का उपयोग करने के लिए हर बार GetDC()/ReleaseDC() को कॉल करें।

  • यह पिछले सा हो सकता है आसान लगता है, लेकिन आप हैरान कितने डेवलपर्स इस मुद्दे में गिर होगा - जब आप वापस बफर पर GDI के साथ आकर्षित, याद रखें कि यह वापस बफर, नहीं फ्रेमबफर है, इसलिए वास्तव में यह देखने के लिए कि आपने क्या खींचा है, आपको आरटी को ओएम में फिर से बांधना होगा और स्वैप चेन-> वर्तमान() विधि को कॉल करना होगा ताकि बैकबफर फ्रेमबफर बन जाए और इसकी सामग्री स्क्रीन पर प्रदर्शित की जाएगी।

+0

हे, आपके उत्तर के लिए धन्यवाद। यह वास्तव में उपयोगी लगता है और शायद मुझे पता है कि समस्या मेरे कोड में कहां है (डीसी जारी करना और रेंडरटेक्ट को पुनर्निर्मित करना)। दुर्भाग्यवश मुझे अब आपके सोल्यूशन का प्रयास करने का कोई समय नहीं मिला है, लेकिन मैं भविष्य में ... – sandicz

संबंधित मुद्दे