it-swarm.dev

في WebGL ما الاختلافات بين السمة وموحد ومتغير متغير؟

هل هناك تشبيه يمكنني التفكير فيه عند مقارنة هذه الأنواع المختلفة ، أو كيف تعمل هذه الأشياء؟

أيضا ، ماذا يعني مصفوفة الزي الرسمي؟

65
Skorpius

منسوخة مباشرة من http://www.lighthouse3d.com/tutorials/glsl-tutorial/data-types-and-variables/ . يحتوي الموقع الفعلي على معلومات أكثر تفصيلًا وسيكون من المفيد التحقق منه.

تصفيات متغيرة

تعطي التصفيات معنى خاصًا للمتغير. التصفيات التالية متاحة:

  • const - الإعلان ثابت وقت الترجمة.
  • السمة - المتغيرات العامة التي قد تتغير لكل قمة ، والتي يتم تمريرها من تطبيق OpenGL إلى تظليل قمة الرأس. لا يمكن استخدام هذا التصفيات إلا في تظليل قمة الرأس. بالنسبة للتظليل ، يعد هذا متغيرًا للقراءة فقط. انظر قسم السمة.
  • منتظم - المتغيرات العامة التي قد تتغير في البدائية [...] ، والتي يتم تمريرها من تطبيق OpenGL إلى تظليل. يمكن استخدام هذا التصفيات في كل من تظليل قمة الرأس والشظية. بالنسبة للتظليل ، هذا متغير للقراءة فقط. انظر القسم الموحد.
  • متباين - يستخدم للبيانات المحرف بين تظليل قمة الرأس وتظليل شظية. متاح للكتابة في تظليل قمة الرأس ، وقراءة فقط في تظليل شظية. انظر القسم المتغير.

بالنسبة إلى القياس ، تشبه const و uniform المتغيرات العالمية في C/C++ ، أحدهما ثابت والآخر يمكن ضبطه. السمة هي متغير يصاحب قمة الرأس ، مثل إحداثيات اللون أو النسيج. يمكن تغيير المتغيرات المتغيرة بواسطة تظليل قمة الرأس ، ولكن ليس بواسطة تظليل الشظية ، لذلك فهي في جوهرها تقوم بنقل المعلومات أسفل خط الأنابيب.

69
Alfredo Gimenez
  • uniform هي معلمات بدائية (ثابتة أثناء مكالمة سحب كاملة) ؛
  • attribute هي معلمات لكل قمة (عادةً: المواضع ، والأوضاع الطبيعية ، والألوان ، والأشعة فوق البنفسجية ، ...) ؛
  • varying هي لكل جزء (أو لكل بكسل ) المعلمات: تختلف من بكسل إلى بكسل.

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

في الصورة التالية ، تلقى بكسل أحمر قيمة محرف للمعلمة متغيرة v. لهذا السبب نسميها "متفاوتة".

varying parameter being bilinearly interpolated

39
neeh

في OpenGL ، "البرنامج" عبارة عن مجموعة من "التظليل" (البرامج الأصغر) ، والتي ترتبط مع بعضها البعض في خط أنابيب.

// "program" contains a shader pipeline:
//   vertex shader -> other shaders -> fragment shader
//
var program = initShaders(gl, "vertex-shader", "fragment-shader");
gl.useProgram(program);

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

تتم كتابة تظليل OpenGL (WebGL) بلغة GLSL (لغة تظليل قائمة على النص يتم تجميعها على وحدة معالجة الرسومات).

// Note: As of 2017, WebGL only supports Vertex and Fragment shaders

<!-- Vertex Shader -->
<script id="shader-vs" type="x-shader/x-vertex">

  // <-- Receive from WebGL application
  uniform vec3 vertexVariableA;

  // attribute is supported in Vertex Shader only
  attribute vec3 vertexVariableB;

  // --> Pass to Fragment Shader
  varying vec3 variableC;

</script>

<!-- Fragment Shader -->
<script id="shader-fs" type="x-shader/x-fragment">

  // <-- Receive from WebGL application
  uniform vec3 fragmentVariableA;

  // <-- Receive from Vertex Shader
  varying vec3 variableC;

</script>

حفظ هذه المفاهيم في الاعتبار:

يمكن لـ Shaders تمرير البيانات إلى التظليل التالي في خط الأنابيب (out ، inout) ، ويمكنهم أيضًا قبول البيانات من تطبيق WebGL أو تظليل سابق (in).

  • يمكن لتظليلتي Vertex و Fragment (أي تظليل حقًا) استخدام متغير uniform ، لتلقي البيانات من تطبيق WebGL.

    // Pass data from WebGL application to shader
    var uniformHandle = gl.glGetUniformLocation(program, "vertexVariableA");
    gl.glUniformMatrix4fv(uniformHandle, 1, false, [0.1, 0.2, 0.3], 0);
    
  • يمكن لـ Vertex Shader أيضًا استلام البيانات من تطبيق WebGL باستخدام المتغير attribute ، والذي يمكن تمكينه أو تعطيله حسب الحاجة.

    // Pass data from WebGL application to Vertex Shader
    var attributeHandle = gl.glGetAttribLocation(mProgram, "vertexVariableB");
    gl.glEnableVertexAttribArray(attributeHandle);
    gl.glVertexAttribPointer(attributeHandle, 3, gl.FLOAT, false, 0, 0);
    
  • يمكن لـ Vertex Shader تمرير البيانات إلى Fragment Shader باستخدام المتغير varying. انظر رمز GLSL أعلاه (varying vec3 variableC;).

5
tfmontague

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

أنا أحب الوصف من https://learnopengl.com/Getting-started/Shaders ، لأن الكلمة لكل - البدائية ليست بديهية

1
Liu Hao