2011-10-06 6 views
6

मैं एक आवेदन पत्र मैं लिख रहा हूँ में इस उदाहरण परियोजना की XNA 4.0 प्रपत्र नियंत्रण का उपयोग कर रहा: http://creators.xna.com/en-US/sample/winforms_series1एक्सएनए 4.0 विनफॉर्म में एनवीडिया एफएक्सएए (शेडर एंटीअलाइजिंग) का उपयोग करने के लिए उदाहरण?

आप FXAA से अपरिचित हैं, निर्माता की साइट की जाँच: http://timothylottes.blogspot.com/2011/03/nvidia-fxaa.html

मैं काफी खर्च किया है कुछ समय तक इसे किसी भी भाग्य के बिना उपयोग करने का प्रयास करने की कोशिश कर रहा है (अब तक ...)। यह सच है कि ग्राफिक्स प्रोग्रामिंग के साथ मुझे बहुत अधिक अनुभव नहीं है, लेकिन मेरे पास वर्तमान में एक अच्छा एप्लीकेशन चल रहा है, यह वास्तव में झटकेदार लाइनों के साथ वास्तव में खराब दिखता है। मैं एए के लिए अंतर्निहित विधि के बारे में जानता हूं, लेकिन मेरे और मेरे लैपटॉप कंप्यूटर के लिए काम नहीं करता है। तो मेरा अनुरोध FXAA का उपयोग करने के बारे में है, न कि अंतर्निहित तरीकों से।

इस बिंदु पर: मेरे पास मेरी सामग्री प्रोजेक्ट में FXAA 3.11 हैडर फ़ाइल है। मैं सिर्फ देखने के लिए अगर किसी को भी विशेष रूप से है कि कस्टम विंडोज़ रूपों विधि का उपयोग कर के साथ, कुछ XNA 4.0 उदाहरण प्रदान कर सकता है यहाँ पूछ रहा हूँ

#define FXAA_PC_CONSOLE 1 
#define FXAA_HLSL_5 1 
#define FXAA_QUALITY__PRESET 12 
#include "Includes/Fxaa3_11.h" 

: मैं जैसे कुछ चीजों के साथ दृश्य स्टूडियो द्वारा उत्पन्न एक सामान्य FX फ़ाइल है।

मैं किसी भी मदद की सराहना करता हूं जो किसी को भी प्रदान करने में सक्षम हो सकता है।

संपादित करें 3: मैं इस संदेश को पोस्ट करने के बाद से FXAA काम करने के तरीके को जानने का प्रयास कर रहा हूं। http://www.gamedev.net/topic/609638-fxaa-help/page__st__20 और इस: मैं इस पाया http://fxaa-pp-inject.assembla.me/trunk/DirectX9/shader.fx

मैं हड्डियों FXAA_PC_CONSOLE प्रकार नंगा करने के लिए FXAA नीचे धारीदार और यह संकलित करता है। मुझे केवल पैरामीटर fxaaConsolePosPos को समझने की आवश्यकता है जो प्रत्येक पिक्सेल की शीर्ष बाएं और निचली दाएं स्थिति है। वैसे भी, ऐसा लगता है कि FXAA_PC_CONSOLE शेडर मॉडल 2.0 के साथ काम कर सकता है जिसे मुझे रीच और Winforms आधारित XNA के साथ उपयोग करने की आवश्यकता है।

+0

क्या विधायक आपके लिए एक विकल्प है? मुझे नहीं लगता कि आपको ट्यूटोरियल में WinForms उदाहरण प्लस FXAA का उपयोग करके कोड का एक उदाहरण मिलेगा। –

+0

कुछ भी लेकिन अंतर्निहित एंटीअलाइजिंग एक विकल्प होना चाहिए यदि यह कम हार्डवेयर पर काम करता है। क्या आपको पता है कि मैं एक विधायक एना को जीतने के लिए कुछ कहां पा सकता हूं? – Scott

+0

वास्तव में एक्सएनए के साथ वास्तव में कुछ भी (जब तक यह गेम क्लास और इस तरह का उपयोग नहीं करता है) ... मुझे अभी तक कुछ भी नहीं मिला है और मैं अभी भी इसे सीखकर खुद को बाहर करने की कोशिश कर रहा हूं मैं xna शेडर्स के बारे में कर सकता हूं – Scott

उत्तर

6

इसलिए मैंने इसे कम से कम FXAA के कम संस्करण का उपयोग करके कंसोल और लो-एंड पीसी के लिए डिज़ाइन किया। मैं शेडर कोड के लिए अपने पैरामीटर की गारंटी नहीं दे सकता, लेकिन जब यह चल रहा है तो मुझे एक उल्लेखनीय अंतर दिखाई देता है।

शेडर कोड पहले (अपनी सामग्री उप-परियोजना में डाल कि एक .fx फ़ाइल में):: टिप्पणी

यहाँ मेरी ऊपर कटा हुआ शेडर और सी # XNA 4.0 कोड के टुकड़े के साथ पूरा समाधान है

: है कि मैं एक सुझाव है कि SM2.0 पहले प्रकार

#define FxaaBool bool 
#define FxaaDiscard clip(-1) 
#define FxaaFloat float 
#define FxaaFloat2 float2 
#define FxaaFloat3 float3 
#define FxaaFloat4 float4 
#define FxaaHalf half 
#define FxaaHalf2 half2 
#define FxaaHalf3 half3 
#define FxaaHalf4 half4 
#define FxaaSat(x) saturate(x) 

#define FxaaInt2 float2 
#define FxaaTex sampler2D 
#define FxaaTexTop(t, p) tex2D(t, float4(p, 0.0, 0.0)) 
#define FxaaTexOff(t, p, o, r) tex2D(t, float4(p + (o * r), 0, 0)) 

FxaaFloat FxaaLuma(FxaaFloat4 rgba) { 
    rgba.w = dot(rgba.rgb, FxaaFloat3(0.299, 0.587, 0.114)); 
return rgba.w; } 

/*============================================================================ 
         FXAA3 CONSOLE - PC VERSION 
============================================================================*/ 
FxaaFloat4 FxaaPixelShader(
    FxaaFloat2 pos, 
    FxaaFloat4 fxaaConsolePosPos, 
    FxaaTex tex, 
    FxaaFloat4 fxaaConsoleRcpFrameOpt, 
    FxaaFloat4 fxaaConsoleRcpFrameOpt2, 
    FxaaFloat fxaaConsoleEdgeSharpness, 
    FxaaFloat fxaaConsoleEdgeThreshold, 
    FxaaFloat fxaaConsoleEdgeThresholdMin) { 
    FxaaFloat lumaNw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xy)); 
    FxaaFloat lumaSw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xw)); 
    FxaaFloat lumaNe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zy)); 
    FxaaFloat lumaSe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zw)); 
    FxaaFloat4 rgbyM = FxaaTexTop(tex, pos.xy); 
    #if (FXAA_GREEN_AS_LUMA == 0) 
     FxaaFloat lumaM = rgbyM.w; 
    #else 
     FxaaFloat lumaM = rgbyM.y; 
    #endif 
    FxaaFloat lumaMaxNwSw = max(lumaNw, lumaSw); 
    lumaNe += 1.0/384.0; 
    FxaaFloat lumaMinNwSw = min(lumaNw, lumaSw); 
    FxaaFloat lumaMaxNeSe = max(lumaNe, lumaSe); 
    FxaaFloat lumaMinNeSe = min(lumaNe, lumaSe); 
    FxaaFloat lumaMax = max(lumaMaxNeSe, lumaMaxNwSw); 
    FxaaFloat lumaMin = min(lumaMinNeSe, lumaMinNwSw); 
    FxaaFloat lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold; 
    FxaaFloat lumaMinM = min(lumaMin, lumaM); 
    FxaaFloat lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled); 
    FxaaFloat lumaMaxM = max(lumaMax, lumaM); 
    FxaaFloat dirSwMinusNe = lumaSw - lumaNe; 
    FxaaFloat lumaMaxSubMinM = lumaMaxM - lumaMinM; 
    FxaaFloat dirSeMinusNw = lumaSe - lumaNw; 
    if(lumaMaxSubMinM < lumaMaxScaledClamped) return rgbyM; 
    FxaaFloat2 dir; 
    dir.x = dirSwMinusNe + dirSeMinusNw; 
    dir.y = dirSwMinusNe - dirSeMinusNw; 
    FxaaFloat2 dir1 = normalize(dir.xy); 
    FxaaFloat4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * fxaaConsoleRcpFrameOpt.zw); 
    FxaaFloat4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * fxaaConsoleRcpFrameOpt.zw); 
    FxaaFloat dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness; 
    FxaaFloat2 dir2 = clamp(dir1.xy/dirAbsMinTimesC, -2.0, 2.0); 
    FxaaFloat4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * fxaaConsoleRcpFrameOpt2.zw); 
    FxaaFloat4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * fxaaConsoleRcpFrameOpt2.zw); 
    FxaaFloat4 rgbyA = rgbyN1 + rgbyP1; 
    FxaaFloat4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25); 
    #if (FXAA_GREEN_AS_LUMA == 0) 
     FxaaBool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax); 
    #else 
     FxaaBool twoTap = (rgbyB.y < lumaMin) || (rgbyB.y > lumaMax); 
    #endif 
    if(twoTap) rgbyB.xyz = rgbyA.xyz * 0.5; 
    return rgbyB; 
} 
/*==========================================================================*/ 

uniform extern float SCREEN_WIDTH; 
uniform extern float SCREEN_HEIGHT; 
uniform extern texture gScreenTexture; 

sampler screenSampler = sampler_state 
{ 
    Texture = <gScreenTexture>; 
    /*MinFilter = LINEAR; 
    MagFilter = LINEAR; 
    MipFilter = LINEAR; 
    AddressU = Clamp; 
    AddressV = Clamp;*/ 
}; 

float4 PixelShaderFunction(float2 tc : TEXCOORD0) : COLOR0 
{ 
    float pixelWidth = (1/SCREEN_WIDTH); 
    float pixelHeight = (1/SCREEN_HEIGHT); 

    float2 pixelCenter = float2(tc.x - pixelWidth, tc.y - pixelHeight); 
    float4 fxaaConsolePosPos = float4(tc.x, tc.y, tc.x + pixelWidth, tc.y + pixelHeight); 

    return FxaaPixelShader(
     pixelCenter, 
     fxaaConsolePosPos, 
     screenSampler, 
     float4(-0.50/SCREEN_WIDTH, -0.50/SCREEN_HEIGHT, 0.50/SCREEN_WIDTH, 0.50/SCREEN_HEIGHT), 
     float4(-2.0/SCREEN_WIDTH, -2.0/SCREEN_HEIGHT, 2.0/SCREEN_WIDTH, 2.0/SCREEN_HEIGHT), 
     8.0, 
     0.125, 
     0.05); 
} 

technique ppfxaa 
{ 
    pass Pass1 
    { 
     PixelShader = compile ps_2_0 PixelShaderFunction(); 
    } 
} 

यहाँ का समर्थन नहीं करता अनुसार tex2D साथ tex2Dlod प्रतिस्थापित सी तेज कोड का एक टुकड़ा शेडर लागू करने के लिए है 210

+0

हाय वहाँ, मैं डब्ल्यूपीएफ परियोजनाओं में उपयोग के लिए एक PixelShader के रूप में FXAA लागू करने का प्रयास करने जा रहा हूं। एक प्रोजेक्ट में मैं काम कर रहा हूं, मेरे पास बहुत सारे बिटमैप-स्तरीय हेरफेर हैं और जंजीर किनारों को सुगम बनाने में सहायता के लिए एक पिक्सेलशेडर लागू करना चाहते हैं। WPF PS3.0 का समर्थन करता है और सिल्वरलाइट ShaderEffect प्रकार में निर्मित PS2.0 का समर्थन करता है। क्या आपके पास या तो डब्ल्यूपीएफ/एसएल के साथ कोई अनुभव है और क्या आपको दिमाग होगा अगर मैंने कुछ प्रश्न पूछे तो क्या मैं विकास पर फंस गया हूं? –

+0

क्षमा करें, मैंने WPF/Silverlight का उपयोग नहीं किया है। असल में इस परियोजना के लिए मैंने कुछ हफ्तों का समय बिताया और इस मुद्दे पर शोध किया क्योंकि वहां बहुत कम जानकारी थी और इसे काम करने के लिए पर्याप्त ही किया गया था। मुझे नहीं लगता कि मैं बहुत मदद कर सकता हूं। – Scott

-1

मैंने हाल ही में अपने खेल में इस तकनीक को लागू किया लेकिन किसी कारण से मेरे किनारे अभी भी "jaggy" बने रहे हैं। क्या कुछ हद तक जालीदार किनारों को नरम करने के लिए कहीं भी कोड को ट्विक करने का कोई तरीका है? धन्यवाद।

+0

प्रश्न का उत्तर नहीं दे रहा है, कृपया एक नया पूछें :) –

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