سؤال

أحاول رسم الكثير من الدوائر على الكرة باستخدام التظليل.الخوارزمية الأساسية هي مثل هذا:

  1. احسب المسافة من الجزء (باستخدام إحداثيات نسيجه) إلى موقع مركز الدائرة (يتم تحديد مركز الدائرة أيضًا في إحداثيات النسيج)
  2. احسب الزاوية من الجزء إلى مركز الدائرة.
  3. استنادًا إلى الزاوية، قم بالوصول إلى النسيج (الذي يحتوي على 360 بكسل فيه وتحدد القناة الحمراء مسافة نصف القطر) واسترجاع نصف القطر للزاوية المحددة
  4. إذا كانت المسافة من القطعة إلى مركز الدائرة أقل من نصف القطر المسترد، فإن لون القطعة يكون أحمر، وإلا فهو أزرق.

أريد أن أرسم...لنفترض 60 دائرة حمراء على كرة زرقاء.حصلت على تظليل للعمل لدائرة واحدة، ولكن كيف نفعل 60؟إليكم ما حاولت حتى الآن....

  1. لقد قمت بتمرير نسيج بيانات يحدد نصف القطر لزاوية معينة، ولكنني لاحظت تسلل العناصر الاصطناعية إلى الداخل.أعتقد أن هذا يرجع إلى الاستيفاء الخطي عندما أحاول استرداد المعلومات من نسيج البيانات باستخدام:

    float returnV = texture2D(angles, vec2(x, y)).r; 
    

    حيث الزوايا هي نسيج البيانات (Sampler2D) الذي يحتوي على نصف القطر لزاوية معينة، وx = الزاوية / 360.0 (الزاوية من 0 إلى 360) وy = 0 إلى 60 (y هو رقم الدائرة)

  2. لقد حاولت تمرير نصف قطر عائم موحد[360]، لكن لا يمكنني الوصول إلى نصف القطر باستخدام الفهرسة الديناميكية.حتى أنني حاولت هذه الفوضى ...

    getArrayValue(int index) {
      if (index == 0) {
        return radii[0];
      }
      else if (index == 1) {
        return radii[1];
      }
    

    وما إلى ذلك وهلم جرا ...

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

شكرًا!!!

~ بولت

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

المحلول

لدي تظليل يجعل دائرة على التضاريس.يتحرك عن طريق تحركات الماوس.ربما تحصل على الإلهام؟

هذا هو برنامج جزء.إنه ليس البرنامج الرئيسي ولكن يمكنك إضافته إلى برنامجك.جرب هذا...

في الوقت الحالي، يمكنك إعطاء بعض المعلمات الموحدة في الكود الثابت.

uniform float showCircle;
uniform float radius;
uniform vec4 mousePosition;

varying vec3 vertexCoord;

void calculateTerrainCircle(inout vec4 pixelColor)
{
 if(showCircle == 1)
 {  
    float xDist = vertexCoord.x - mousePosition.x;
    float yDist = vertexCoord.y - mousePosition.y;

    float dist = xDist * xDist + yDist * yDist;
    float radius2 = radius * radius;

    if (dist < radius2 * 1.44f && dist > radius2 * 0.64f)
    {
        vec4 temp = pixelColor;

        float diff;
        if (dist < radius2)
            diff = (radius2 - dist) / (0.36f * radius2);
        else
            diff = (dist - radius2) / (0.44f * radius2);

        pixelColor = vec4(1, 0, 0, 1.0) * (1 - diff) + pixelColor * diff;   

        pixelColor = mix(pixelColor, temp, diff);
    }               
}   
}

وفي تظليل قمة الرأس تضيف:

varying vec3 vertexCoord;

void main()
{
    gl_Position = ftransform();

    vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
    vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
}

نصائح أخرى

ufukgun, ، إذا قمت بضرب المصفوفة في معكوسها فستحصل على الهوية.
لك؛

vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);

وبالتالي يعادل

vertexCoord = vec3(gl_Vertex);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top