سؤال

ومرحبا وآسف على لقب غامضة:} وأنا سوف أحاول أن أشرح أفضل ما يمكن.

وأولا وقبل كل شيء، أنا جديدة على HLSL ولكن أنا أفهم حول خط الأنابيب والاشياء التي هي من العالم خرافية. ما أنا موجود تحاول أن تفعل غير استخدام الجرافيك لالحسابية العامة (GPGPU).

وماذا أنا لا أعرف هو: كيف يمكنني قراءة * القمم (التي تم تحويلها باستخدام تظليل قمة الرأس) إلى تطبيق XNA بلدي؟ قرأت شيئا حول استخدام الذاكرة نسيج من الجرافيك ولكن لا أستطيع العثور على أي شيء صلب ...

وشكرا مقدما على أي معلومات / طرف! : -)

* ليس متأكدا مما اذا bacause المحتمل للبرنامج التقييم وتظليل بكسل (إن وجدت)، يعني في النهاية كل شيء عن بكسل، أليس كذلك؟

هل كانت مفيدة؟

المحلول

وبقدر ما أعرف أن هذا ليس من الممكن عموما.

ما هي بالضبط كنت تحاول أن تفعل؟ وربما هناك حل آخر

وتحرير :: مع الأخذ بعين الاعتبار للتعليق. إذا كان كل ما تريد القيام به هو حسابات ناقلات العامة في المحاولة GPU القيام بها في تظليل بكسل بدلا من تظليل قمة الرأس.

وهكذا على سبيل المثال، لنفرض أنك تريد القيام به عبر متجهين، أولا نحن بحاجة إلى إرسال البيانات إلى نسيج

//Data must be in the 0-1 range before writing into the texture, so you'll need to scale everything appropriately
Vector4 a = new Vector4(1, 0, 1, 1);
Vector4 b = new Vector4(0, 1, 0, 0);

Texture2D dataTexture = new Texture2D(device, 2, 1);
dataTexture.SetData<Vector4>(new Vector4[] { a, b });

وحتى الآن نحن قد حصلت على الملمس 2 * 1 مع البيانات الموجودة، وتجعل نسيج ببساطة عن طريق استخدام ال SpriteBatch والأثر:

Effect gpgpu;
gpgpu.Begin();
gpgpu.CurrentTechnique = gpgpu.Techniques["DotProduct"];
gpgpu.CurrentTechnique.Begin();
spriteBatch.Begin();
gpgpu.CurrentTechnique.Passes[0].Begin();
spriteBatch.Draw(dataTexture, new Rectangle(0,0,2,1), Color.White);
spriteBatch.end();
gpgpu.CurrentTechnique.Passes[0].End();
gpgpu.CurrentTechnique.End();

وكل ما نحتاج إليه الآن هو تأثير غبغبو لقد المبينة أعلاه. هذا مجرد معيار تظليل بعد تجهيز، وتبحث عن شيء مثل هذا:

sampler2D DataSampler = sampler_state
{
    MinFilter = Point;
    MagFilter = Point;
    MipFilter = Point;
    AddressU = Clamp;
    AddressV = Clamp;
};

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
    float4 A = tex2D(s, texCoord);
    float4 B = tex2D(s, texCoord + float2(0.5, 0); //0.5 is the size of 1 pixel, 1 / textureWidth
    float d = dot(a, b)
    return float4(d, 0, 0, 0);
}

technique DotProduct
{
    pass Pass1
    {
        PixelShader = compile ps_3_0 PixelShaderFunction();
    }
}

وهذا سوف أكتب من المنتج نقطة من ألف وباء في بكسل الأول، ونقطة المنتج من B و B في بكسل الثاني. ثم يمكنك أن تقرأ هذه الإجابات الظهر (تجاهل تلك عديمة الفائدة)

Vector4[] v = new Vector4[2];
dataTexture.GetData(v);
float dotOfAandB = v[0];
float dotOfBandB = v[1];

وتادا! هناك حمولة كاملة من القضايا الصغيرة مع محاولة القيام بذلك على أكبر نطاق، تعليق هنا وسأحاول مساعدتك في أي واجهت:)

نصائح أخرى

إذا قمت بتشغيل "إخراج ستريم مرحلة ، و "سيتم تخزين مخرجات تظليل قمة الرأس الخاصة بك في مخزن الذاكرة المؤقت. في وقت لاحق هذه القيم يمكن قراءتها من GPU أو CPU كما تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top