HLSL - كيف يمكنني تعيين مرشحات Sampler Min/MAG/MIP لتعطيل جميع التصفية/مكافحة التزايد؟

StackOverflow https://stackoverflow.com/questions/2700041

  •  01-10-2019
  •  | 
  •  

سؤال

لدي عينة Tex2D أريد فقط إرجاع تلك الألوان التي توجد على ملمستي. أنا أستخدم Shader Model 3 ، لذلك لا يمكنني استخدامه حمل.

في حالة تداخل ألوان متعددة متداخلة ، أريد أن تختار واحدة وأن يكون هذا اللون كله.

أعتقد أن أفعل ذلك ، أريد تعطيل MIPMapping ، أو على الأقل تصفية ثلاثية من MIPs.

sampler2D gColourmapSampler : register(s0) = sampler_state {
    Texture = <gColourmapTexture>; //Defined above
    MinFilter = None; //Controls sampling. None, Linear, or Point.
    MagFilter = None; //Controls sampling. None, Linear, or Point.
    MipFilter = None; //Controls how the mips are generated. None, Linear, or Point.
    //...
};

مشكلتي هي أنني لا أفهم حقًا تصفية MIN/MAG/MIP ، لذلك لست متأكدًا من المجموعة التي أحتاج إلى تعيينها ، أو إذا كان هذا هو ما أنا بعده.

يا له من جزء من نسيج المصدر الخاص بي ؛
http://img689.imageshack.us/img689/6171/sourcev.png

لقطة شاشة لما تبدو عليه المنطقة ذات الصلة بعد تعيين الملمس الكامل إلى مجال بلدي ؛
http://img717.imageshack.us/img717/9202/resultc.png
المصنوعات اليدوية المضادة/المزج/التصفية مرئية بوضوح ؛ لا أريد هذه.


MSDN هل هذا هو القول ؛

D3DSAMP_MAGFILTER: مرشح التكبير من النوع d3dtexturefiltertype

D3DSAMP_MINFILTER: مرشح التصوير من النوع d3dtexturefiltertype.

D3DSAMP_MIPFILTER: مرشح MIPMAP لاستخدامه أثناء التصوير. نرى d3dtexturefiltertype.

d3dtexf_none: عند استخدامها مع d3dsamp_mipfilter ، يعطل miPmapping.

رابط جيد آخر على فهم الجوهارات HLSL.


تم الحل

ليس مشكلة HLSL على الإطلاق! آسف كل شيء. يبدو أنني أطرح الكثير من الأسئلة التي من المستحيل الإجابة عليها. كان Ogre الإفراط في ركوب الإعدادات أعلاه. تم إصلاح هذا مع ؛

Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::FO_NONE , Ogre::FO_NONE, Ogre::FO_NONE);
هل كانت مفيدة؟

المحلول

ما يبدو الأمر بالنسبة لي هو أنك تحصل على القيم من خريطة MIP ذات المستوى الأدنى (غير المفلح) من أعلى التفاصيل التي تعرضها.

MipFilter = None 

يجب أن تمنع ذلك ، ما لم يتجاوز شيء ما في الكود. لذلك ابحث عن مكالمات إلى setSamplerState.

نصائح أخرى

ما فعلته يجب أن يؤدي إلى إيقاف تشغيل التصفية. هناك مشكلتان محتملتان ، يمكنني التفكير فيهما

1) يتجاهلك السائق فقط ومرشحات على أي حال (إذا كان هذا يحدث ، فلا يوجد شيء يمكنك القيام به) 2) لديك شكل من أشكال مكافحة الحافة الممكّنة.

بالنظر إلى صورتك الناتجة التي لا تشبه إلى حد كبير تصفية الأثرية بالنسبة لي ، لذلك أعتقد أنك تعاني من تشغيل مضادات التنفس في مكان ما. هل قمت بتعيين علامة مضادة للتخلي عند إنشاء الجهاز/النص النصي؟

إذا كنت ترغب في الحصول على Texel واحد فقط ، فاستخدم load بدلاً من sample. load يأخذ (بقدر ما أعرف) int2كوسيطة ، يحدد إحداثيات الصفيف الفعلية في الملمس. load يبحث بعد ذلك عن الإدخال في نسيجك في إحداثيات المصفوفة المحددة.

لذا ، فقط قم بتوسيع نطاق float2, ، على سبيل المثال باستخدام ceil(float2(texCoord.x*textureWidth, texCoord.y*textureHeight)).

MSDN للتحميل: http://msdn.microsoft.com/en-us/library/bb509694(vs.85).aspx

عند استخدام فقط Shader Model 3 ، يمكنك الاختراق قليلاً لتحقيق ذلك: مرة أخرى ، دعنا نفترض أنك تعرف textureWidth و textureHeight.

// compute floating point stride for texture
float step_x = 1./textureWidth;
float step_y = 1./textureHeight;

// compute texel array coordinates
int target_x = texCoord.x * textureWidth;
int target_y = texCoord.y * textureHeight;

// round to values, such that they're multiples of step_x and step_y
float2 texCoordNew;
texCoordNew.x = target_x * step_x;
texCoordNew.y = target_y * step_y;

لم أختبرها ، لكنني أعتقد أنه يمكن أن ينجح.

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