שילוב בין שתי אפליקציות המרנדרות dx sences
לפעמים יש צורך לשלב בין שני scene ים ששתי אפליקציות Direct3D שונות יוצרות לתוך Scene אחד .
לדוגמא: אני רוצה להשתמש באפליקציה שלי בBing maps לצורך יצירת ועדכון הterrain ומעל הTerrain אני צריך לרנדר את האובייקטים שלי .
בניגוד למקרה עם אפליקציות 2D שאולי אפשר לשלב תמונות על ידי משחק עם ערכי alpha המצב בעולם של התלת מימד מורכב בהרבה .
הטכנולוגיות יכולות להיות מדור שונהBing עובד מול Direct3d9 ואני עובד עם Direct3d11 .כל ה api והאובייקטים שונים מאוד .
פעולת הrender חייבת להיות משותפת על מנת שהZ-buffer filter יפעל גם על האובייקטים שלי וגם על האובייקטים של Bing .כלומר אם מכונית שאני מרנדר נמצאת מאחורי הר שbing מרדנר ההר צריך להסתיר את המכונית שאני מרנדר .
פעולות בshaders של הצללה ואור צריכות להיות משותפות .(הקונספט של שמש בגבעון דום וירח בעמק איילון לא תופס כאן ) אותו מקור תאורה משפיע הן על האובייקטים שלי והן על האובייקטים המיובאים .
כמו כן יש אוביקטים בscene של Bing שאני לא רוצה שירונדרו אצלי באפליקציה אני רוצה רק את הTerrain נטו מבלי כפתורים שBing מרנדרת על הscene שלה .
מכיוון שאי אפשר לשתף את הsurface ים בין האפליקציות וbing לא פותח לנו api של קבלת הResource ים מbing (הVertexים והTexture ים ) אנו צריכים להוציא את הResources מBing לא בדרך המלך.
הפתרון שמימשנו
הפתרון מתבסס על יירוט של הקריאות ל dx api על ידי Bing .
יצרנו אפליקצית .net win form שמריצה WebBrowser Control ולתוך ה WebBrowser control אנו טוענים עמוד html מקומי שמציג את Bing אפשר לשלוט על Bing באמצעות פקודות של automation פשוטת של בחירת המיקום בעולם שהמפה מציגה וכד .
אנו יוצרים proxy dll שתפקידו ליירט קריאות מBing ל d3d9.dll ישנם מספר דוגמאות לשלד של dll כזה במרחבי ה Web . הDLL בשם d3d9.dll ממוקם בספריה שמריצה את האפליקציה עם Bing ולכן Bing טוען את הProxy dll שלנו כאשר הוא קורא לCreateDevice
אנו כתבנו proxy ל interface ים החשובים של Dx9 אשר הם נקראים במקום האורגינלים .
ברגע שאנו מיירטים פקודה שBing פקד וזו פקודה שמעדכנת Resource אנו מעתיקם את המידע שלה ל shared memory שמשותף ל dll המירט ו האפליקציה שלנו וכך יש לנו ביד את הpre resource ואנו מכניסים אותו ל pipline שלנו בתהליך הRender שלנו .
אנו צריכים לקלף או להתאים את הResource לDX11 יש שוני מהותי בין העבודה עם Resources בDX9 שהשתנה עם המעבר ל DX10 יש שונה בהדרת הSurfaceים וכד
אין צורך שתהליך הירוט יעביר את קריאות הRender ל d3d9.dll האורגינל חבל על תעבורה על הBus המיותרת ועבודת הכרטיס מסך.יש פקודות בעיקר אתחול שכן צריכות לקרא ל d3d9.dll המקורי על מנת ש bing יוכל לאתחל את העבודה שלו. הכל בתלות במשחק של trial and error .