سؤال

أنا أعمل حاليا على مشروع باستخدام C++ و DirectX9 و أنا أبحث في خلق مصدر الضوء الذي يختلف في اللون مع مرور الوقت.

أنا أعرف C++ لديه timeGetTime() وظيفة ، ولكن أتساءل عما إذا كان أي شخص يعرف من وظيفة في HLSL من شأنها أن تسمح لي أن أفعل هذا ؟

التحيات.مايك.

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

المحلول

استخدم ثابت تظليل في HLSL (انظر هذا مقدمة ). هنا هو رمز المثال HLSL يستخدم timeInSeconds لتعديل الملمس تنسيق:

// HLSL
float4x4 view_proj_matrix; 
float4x4 texture_matrix0; 
// My time in seconds, passed in by CPU program
float    timeInSeconds;

struct VS_OUTPUT 
{ 
   float4 Pos     : POSITION; 
   float3 Pshade  : TEXCOORD0; 
}; 


VS_OUTPUT main (float4 vPosition : POSITION) 
{ 
   VS_OUTPUT Out = (VS_OUTPUT) 0;  

   // Transform position to clip space 
   Out.Pos = mul (view_proj_matrix, vPosition); 

   // Transform Pshade 
   Out.Pshade = mul (texture_matrix0, vPosition);

   // Transform according to time
   Out.Pshade = MyFunctionOfTime( Out.Pshade, timeInSeconds );

   return Out; 
} 

وبعد ذلك في التعليمات البرمجية التقديم (CPU) قبل استدعاء بيغن () على التأثير الذي يجب الاتصال على:

// C++
myLightSourceTime = GetTime(); // Or system equivalent here:
m_pEffect->SetFloat ("timeInSeconds ", &myLightSourceTime); 

إذا كنت لا تفهم مفهوم الثوابت تظليل، ولها قراءة سريعة للPDF. يمكنك استخدام أي نوع بيانات HLSL كما ثابت (على سبيل المثال منطقي، تطفو، float4، float4x4 والأصدقاء).

نصائح أخرى

وأنا لست على دراية HLSL، ولكن أنا مع GLSL.

وشادرس ليس لديهم مفهوم "الوقت" أو "إطارات". قمة تظليل "يفهم" القمم لتقديم وتظليل بكسل "يفهم" القوام لتقديم.

ولديك الخيار الوحيد هو لتمرير متغير إلى برنامج تظليل، في GLSL ويسمى "موحدة"، ولكنني لست متأكدة HLSL.

<اقتباس فقرة>   

وأنا أبحث في خلق ضوء   المصدر الذي يختلف في اللون مع مرور الوقت   تطول.

وليس هناك حاجة لتمرير أي شيء مع ذلك، على الرغم من. يمكنك تعيين مباشرة اللون مصدر الضوء و(على الأقل، ويمكن في OpenGL لك). ببساطة تغيير لون فاتح على الساحة تقديم وتظليل يجب أن يستلم من زي المضمنة.

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

إذا كنت تستخدم HLSL لكتابة تظليل الوحدة مرة في ثوان متغير كما يتعرض _Time.

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