Ru/Shader: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
mNo edit summary
m (obsolete language category)
 
(9 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{lang|Shader|title = Шейдер}}
{{LanguageBar|title = Оттенение}}
{{see also|[[:Category:Shaders]]}}


'''Шейдер''' это программа которая запускается на [https://ru.wikipedia.org/wiki/Графический_процессор графическом процессоре] чтобы определить, как объект должен быть отрисован. Source использует шейдеры для всего в 3D мире.


Шейдеры манипулируют управляются параметрами, содержащимися в файлах [[Material:ru|Материалов]]. В то время как самые распространенные довольно просты, существуют очень сложные для обработки таких эффектов, как тени в реальном времени, освещение и преломление.
'''Оттенение (Shader)''' - это набор команд, исполняемый на [https://ru.wikipedia.org/wiki/Графический_процессор графическом процессоре], чтобы определить, как объект должен быть отображён. Source использует оттенения для всего в 3D мире.
 
Оттенением можно управлять посредством параметров, содержащихся в файлах {{L|Material|материалов}}. В то время как самые распространенные довольно просты, существуют очень сложные для обработки таких эффектов, как тени в реальном времени, освещение и преломление.


== Типы ==
== Типы ==
Существует две разновидности оттенений, Точечное оттенение и Вершинное оттенение, каждое из них выполняет разные задачи в конвейере данных рендера. Оттенения заменяют собой конвейер фиксированных функций и позволяет разработчикам лучшн управлять выводом отображения, предоставляя возможность динамического изменения пикселей и вершин*. SDK включает множество {{LCategory|Shaders|существующих оттенений}}.


Существует две вариации шейдеров, Пиксельные шейдеры и Вершинные шейдеры. Каждый из них выполняет разные задачи в конвейере данных рендера. Шейдеры формируют замену для фиксированных функций конвейера-данных и позволяет разработчикам лучший контроль над выводом рендеринга, предоставляя возможность динамического изменения пикселей и вершин*. SDK включает множество [[:Category:Shaders | существующих шейдеров ]].
== Языки программирования ==
В настоящее время существует три основных языка для программирования оттенений: {{L|HLSL|High Level Shader Language (HLSL)}}, {{L|CG|C for Graphics (Cg)}} и [[Wikipedia:GLSL | OpenGL Shading Language (GLSL)]]. Source engine использует оттенения на основе {{L|HLSL}}. Однако Cg очень схож с Cg шейдерами поэтому может быть быстро и просто портирован под HLSL.


== Шейдерные языки ==
== Спецификация оттенений ==
Используемая версия спецификации оттенения определяет насколько современные методы оттенения поддерживаются графической картой. Это не позволяет старым графическим картам физически распознавать новые методы оттенения.


В настоящее время существует три основных языка шейдеров: [[HLSL:ru|High Level Shader Language (HLSL)]], [[CG:ru|C for Graphics (Cg)]] и [[Wikipedia:GLSL | OpenGL Shading Language (GLSL)]]. Source engine использует шейдеры на основе [[HLSL:ru|HLSL]]. Однако Cg очень схож с Cg шейдерами поэтому может быть быстро и просто портирован под HLSL.
Современные версии {{Source|2}} поддерживают Shader Model 2.0 (включая Pixel Shader 2.0b) и Shader Model 3.0.
{{Note|Оттенения написанные под SM3 могут не работать должным образом на системах Mac и Linux из-за отсутствия поддержки Valve's runtime graphics wrapper, <code>togl</code>. Вы должны планировать сделать SM2.0b версию вашего оттенения, если Вы планируете поддерживать эти OC.}}


== Шейдерные модели ==
При создании оттенения под новые видеокарты важно не забывать поддерживать тех, у кого есть старые видеокарты иначе Вы сильно ограничите возможность использования вашей игры. Старые графические карты могут потребовать указания так называемых "резервных оттенений", когда резервное оттенение (с использованием более старой спецификации) будет использоваться в случае сбоя современного оттенения.
Шейдерная модель определяет как ''продвинутые'' методы шейдинга могут попасть на графическую карту. Это не позволяет старым графическим картам физически распознавать новые методы шейдинга.


Современные версии [[Source:ru | Source]] поддерживают Shader Model 2.0 (включая Pixel Shader 2.0b) и Shader Model 3.0.
Если Вы хотите узнать подробнее о различный спецификациях оттенений, смотрите [[Wikipedia:High Level Shader Language|Статью в википедии]].
{{note:ru|Шейдеры написанные под SM3 могут не работать должным образом на системах Mac и Linux из-за отсутствия поддержки Valve's runtime graphics wrapper, <code>togl</code>. Вы должны планировать сделать SM2.0b версию вашего шейдера, если вы планируете поддерживать эти OC.}}


Когда создаёшь шейдеры под новые видео карты важно не забывать поддерживать тех, у кого есть старые видео карты или вы быстро ограничите спецификации вашей игры только несколькими избранными. Старые графические карты могут потребовать указания так называемых "резервных шейдеров", где резервный шейдер (использующий более старую модель шейдера) будет использоваться в случае сбоя нового шейдера.
Дополнительные сведения о создании оттенений для использования на платформе Source см. в разделе {{L|Shader Authoring|Создание шейдеров}}.


Если вы хотите узнать подробнее о спецификации различных моделей шейдеров, смотрите [[Wikipedia:High Level Shader Language|Статью в википедии]].
== Вершинное оттенение ==
Вершинное оттенение применяются для каждой вершины, запущенной в программируемом конвейере. Its most basic goal is to transform geometry into screenspace coordinates so that the Pixel shader can rasterize an image. Vertex shaders can modify these position coordinates to perform mesh deformation. They can also receive additional information from the mesh, including normals, tangents, and texture coordinates. The vertex shader then writes to output registers; the written values are then interpolated across the vertices in the pixel shaders. Вершинное оттенение не создаёт реальные вершины.


Дополнительные сведения о создании шейдеров для использования в движке Source см. в разделе [[Shader Authoring:ru | Создание шейдеров]].
Ниже приведен подробно прокомментированный пример вершинного оттенения, готовый к использованию в Source.


== Vertex шейдеры ==
=== Пример Вершинного оттенения ===
Вершинные шейдеры применяются для каждой вершины, запущенной в программируемом конвейере. Its most basic goal is to transform geometry into screenspace coordinates so that the Pixel shader can rasterize an image. Vertex shaders can modify these position coordinates to perform mesh deformation. They can also receive additional information from the mesh, including normals, tangents, and texture coordinates. The vertex shader then writes to output registers; the written values are then interpolated across the vertices in the pixel shaders. Вершинные шейдеры не могут создавать вершины.
This is a pass through shader - in so far as it makes no major modification to the vertex data, instead just passing the data through to the pixel shader stage.


Ниже приведен сильно прокомментированный пример вершинного шейдера, готовый к использованию в Source.
{{CodeBlock|lines=31|<nowiki>// common vertex shader defines provided with this header
#include "common_vs_fxc.h"


=== Пример Вершинного шейдера ===
// define an output structure
This is a pass through shader - in so far as it makes no major modification to the vertex data, instead just passing the data through to the pixel shader stage.
struct VS_OUTPUT
{
// position vector (float4)
float4 pos      : POSITION0;
 
// texture coordinates (uv - float2)
float2 texCoord  : TEXCOORD0;
};
 
// main function - note C style definition
// takes a position vector (float4)
// returns a VS_OUTPUT struct
VS_OUTPUT main( float4 inPos: POSITION )
{
// declare an empty VS_OUTPUT to fill
VS_OUTPUT o = (VS_OUTPUT) 0;
 
// compute the sign of the input position
inPos.xy = sign( inPos.xy);
 
// set the output position using the xy of the input
o.pos = float4( inPos.xy, 0.0f, 1.0f);


// common vertex shader defines provided with this header
// get into range [0,1]
#include "common_vs_fxc.h"<br>
o.texCoord = (float2(o.pos.x, -o.pos.y) + 1.0f)/2.0f;
// define an output structure
return o;
struct VS_OUTPUT
}</nowiki>}}
{
  // position vector (float4)
  float4 pos      : POSITION0;
  // texture coordinates (uv - float2)
  float2 texCoord  : TEXCOORD0;
};<br>
// main function - note C style definition
// takes a position vector (float4)
// returns a VS_OUTPUT struct
VS_OUTPUT main( float4 inPos: POSITION )
{
  // declare an empty VS_OUTPUT to fill
  VS_OUTPUT o = (VS_OUTPUT) 0;<br>
  // compute the sign of the input position
  inPos.xy = sign( inPos.xy);
  // set the output position using the xy of the input
  o.pos = float4( inPos.xy, 0.0f, 1.0f);<br>
  // get into range [0,1]
  o.texCoord = (float2(o.pos.x, -o.pos.y) + 1.0f)/2.0f;
  return o;
}


== Пиксельные шейдеры ==
== Точечное оттенение ==
Pixel shaders are applied for each pixel rendered to the screen. A pixel shader expects input from interpolated vertex values, which it then uses to rasterize the image. Pixel shaders can produce a huge range of effects involving the color of individual pixels such as refraction, per-pixel lighting or reflection.
Pixel shaders are applied for each pixel rendered to the screen. A pixel shader expects input from interpolated vertex values, which it then uses to rasterize the image. Pixel shaders can produce a huge range of effects involving the color of individual pixels such as refraction, per-pixel lighting or reflection.


A heavily commented example pixel shader, ready for use in Source is provided below.
A heavily commented example pixel shader, ready for use in Source is provided below.


=== Пример пиксельного шейдера ===
=== Пример точечного оттенения ===
The pixel shader below is intended for use as a post-process shader and creates a grayscale effect.
The pixel shader below is intended for use as a post-process shader and creates a grayscale effect.


// specify a texture sampler, the actual source of this is specified in a vmt
{{CodeBlock|lines=15|<nowiki>// specify a texture sampler, the actual source of this is specified in a vmt
sampler2D Texture0 : register( s0 );<br>
sampler2D Texture0 : register( s0 );<br>
// same function declaration style as vertex shaders
// same function declaration style as vertex shaders
// pixel shaders return the colour value of the pixel (hence the float4)
// pixel shaders return the colour value of the pixel (hence the float4)
float4 main( float2 texCoord  : TEXCOORD0 ) : COLOR
float4 main( float2 texCoord  : TEXCOORD0 ) : COLOR
{
{
  // sample the texture at the specified texture coordinates
// sample the texture at the specified texture coordinates
  float4 tex = tex2D( Texture0, texCoord );<br>     
float4 tex = tex2D( Texture0, texCoord );<br>     
  // greyscale the pixel colour values
// greyscale the pixel colour values
  // - perform a dot product between the pixel colour and the specified vector
// - perform a dot product between the pixel colour and the specified vector
  // - 0.222, 0.707, 0.071 is found throughout image processing for gray scale effects.
// - 0.222, 0.707, 0.071 is found throughout image processing for gray scale effects.
  float4 grey = dot(float3(0.222, 0.707, 0.071), tex);<br>   
float4 grey = dot(float3(0.222, 0.707, 0.071), tex);<br>   
  // return the pixel colour in the form of a float4.           
// return the pixel colour in the form of a float4.           
  return grey;
return grey;
}
}</nowiki>}}


== Applications of shaders in Source ==
==Наложение оттенений в Source==
Source Engine поставляет две отдельные формы шейдеров, Постпроцесс и Pre-Object, большинство эффектов и материалов используемых в Source Engine, в сильно зависят от компонентов пиксельного шейдера.
Платформа {{Source|2}} позволяет использовать два отличающихся вида оттенения, Постобработка и Объектное, большинство эффектов и материалов используемых на платформе {{Source|2}} в значительной степени определяются компонентами точечного оттенения.


=== Постпроцесс ===
===Постобработка===
Постпроцессный шейдер, это обычный Пиксельный шейдер работающий на кваде, отображаемый по всему экрану. Квад тексурирован копией из фрейм-буфера, Пиксельный шейдер может заменить и модифицировать выходной рендер чтобы создать разнообразные эффекты, например, базовая модификация цвета для более продвинутых процессов, таких как размытие движения и свечение.
Постобработка, это обычное Пиксельное оттенение применённое к прямоугольной области изображения, отображаемым по всему экрану. Прямоугольная область содержит копию из кадрового-буфера, Пиксельный оттенение может заменить и модифицировать выходное отображение, чтобы создать разнообразные эффекты, например, базовая модификация цвета для более продвинутых процессов, таких как размытие движения и свечение.


{{note:ru | Эта информация не актуальна и файлы более не включены в SDK. <code>sdk_bloom.cpp</code> и <code>sdk_bloom.ps20.fxc</code> определяют один возможный шейдер, который может быть использован, как альтернативный пример.}}
{{Note | Эта информация не актуальна и файлы более не включены в SDK. {{file|sdk_bloom|cpp}} и {{file|sdk_bloom.ps20|fxc}} определяют одно возможное оттенение, которое может быть использовано, как альтернативный пример.}}


Source SDK предоставляет пример этой формы шейдера в файлах постпроцесса (<code>sdk_postprocess.cpp</code>, <code>sdk_postprocess_vs20.fxc</code>, и <code>sdk_postprocess_ps20.fxc</code>)
Source SDK предоставляет пример этого вида оттенения в файлах постобработки ({{file|sdk_postprocess.cpp|cpp}}, {{file|sdk_postprocess_vs20|fxc}}, и {{file|sdk_postprocess_ps20|fxc}})


Продвинутые шейдеры постпроцесса, такие как шейдеры свечения и размытие движения, входящие в состав source, могут нуждаться в использовании пользовательских [[Render_target:ru|Целей Рендеринга]]
Продвинутая постобработка, такая как свечение и размытие движения, интегрированны на платформе {{Source|2}}, могут пригодиться для создании пользовательских {{L|Render_target|Целей Рендеринга}}


=== Per-object ===
===Объектное===
A Per-Object shader in the Source engine is used on any object with the shader referenced in the relevant [[VMT|Valve Material (.vmt)]] file, such as a model or piece of brushwork. A Per-Object shader could be used to create a refractive material, modify a models vertices dynamically or other advanced rendering effects.
Объектное оттенение на платформе {{Source|2}} используется на любом объекте, если ссылка на оттенение указана в применяемом файле {{L|VMT|материала (.vmt)}} , например модели или элементы карты. Объектное оттенение можно использовать для создания преломляющего материала, динамического изменения вершин модели или других расширенных эффектов отображения.


The Source SDK provides an example of a Per-Object shader in the lightmap files ( <code>sdk_lightmap.cpp</code>, <code>sdk_lightmap_vs20.fxc</code>, and <code>sdk_lightmap_ps20.fxc</code>)
The Source SDK provides an example of a Per-Object shader in the lightmap files ({{file|sdk_lightmap|cpp}}, {{file|sdk_lightmap_vs20|fxc}}, and {{file|sdk_lightmap_ps20|fxc}})


== External links ==
==Внешние ссылки==
* [https://www.bit-tech.net/hardware/2005/07/25/guide_to_shaders/1 A bluffer's guide to Shader Models]
* [https://www.bit-tech.net/hardware/2005/07/25/guide_to_shaders/1 A bluffer's guide to Shader Models]
* [https://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter01.html NVIDIA - The Cg tutorial]
* [https://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter01.html NVIDIA - The Cg tutorial]
Line 110: Line 116:
* [https://www.moddb.com/games/half-life-2/tutorials/post-process-shader Post-Process Shader Tutorial from Wraiyth]
* [https://www.moddb.com/games/half-life-2/tutorials/post-process-shader Post-Process Shader Tutorial from Wraiyth]


[[Category:Glossary:ru]]
 
[[Category:Programming:ru]]
{{ACategory|Glossary}}
{{ACategory|Programming}}
[[Category:Shaders:ru|*]]
[[Category:Shaders:ru|*]]
[[Category:Technical:ru]]
{{ACategory|Technical}}
 
{{ACategory|Material_System}}

Latest revision as of 04:05, 22 August 2024

English (en)Español (es)Русский (ru)Українська (uk)中文 (zh)Translate (Translate)
См. также:  Category:Shaders


Оттенение (Shader) - это набор команд, исполняемый на графическом процессоре, чтобы определить, как объект должен быть отображён. Source использует оттенения для всего в 3D мире.

Оттенением можно управлять посредством параметров, содержащихся в файлах материалов(en). В то время как самые распространенные довольно просты, существуют очень сложные для обработки таких эффектов, как тени в реальном времени, освещение и преломление.

Типы

Существует две разновидности оттенений, Точечное оттенение и Вершинное оттенение, каждое из них выполняет разные задачи в конвейере данных рендера. Оттенения заменяют собой конвейер фиксированных функций и позволяет разработчикам лучшн управлять выводом отображения, предоставляя возможность динамического изменения пикселей и вершин*. SDK включает множество существующих оттенений(en).

Языки программирования

В настоящее время существует три основных языка для программирования оттенений: High Level Shader Language (HLSL)(en), C for Graphics (Cg)(en) и OpenGL Shading Language (GLSL). Source engine использует оттенения на основе HLSL(en). Однако Cg очень схож с Cg шейдерами поэтому может быть быстро и просто портирован под HLSL.

Спецификация оттенений

Используемая версия спецификации оттенения определяет насколько современные методы оттенения поддерживаются графической картой. Это не позволяет старым графическим картам физически распознавать новые методы оттенения.

Современные версии Source Source поддерживают Shader Model 2.0 (включая Pixel Shader 2.0b) и Shader Model 3.0.

Note.pngПримечание:Оттенения написанные под SM3 могут не работать должным образом на системах Mac и Linux из-за отсутствия поддержки Valve's runtime graphics wrapper, togl. Вы должны планировать сделать SM2.0b версию вашего оттенения, если Вы планируете поддерживать эти OC.

При создании оттенения под новые видеокарты важно не забывать поддерживать тех, у кого есть старые видеокарты иначе Вы сильно ограничите возможность использования вашей игры. Старые графические карты могут потребовать указания так называемых "резервных оттенений", когда резервное оттенение (с использованием более старой спецификации) будет использоваться в случае сбоя современного оттенения.

Если Вы хотите узнать подробнее о различный спецификациях оттенений, смотрите Статью в википедии.

Дополнительные сведения о создании оттенений для использования на платформе Source см. в разделе Создание шейдеров(en).

Вершинное оттенение

Вершинное оттенение применяются для каждой вершины, запущенной в программируемом конвейере. Its most basic goal is to transform geometry into screenspace coordinates so that the Pixel shader can rasterize an image. Vertex shaders can modify these position coordinates to perform mesh deformation. They can also receive additional information from the mesh, including normals, tangents, and texture coordinates. The vertex shader then writes to output registers; the written values are then interpolated across the vertices in the pixel shaders. Вершинное оттенение не создаёт реальные вершины.

Ниже приведен подробно прокомментированный пример вершинного оттенения, готовый к использованию в Source.

Пример Вершинного оттенения

This is a pass through shader - in so far as it makes no major modification to the vertex data, instead just passing the data through to the pixel shader stage.

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
// common vertex shader defines provided with this header #include "common_vs_fxc.h" // define an output structure struct VS_OUTPUT { // position vector (float4) float4 pos  : POSITION0; // texture coordinates (uv - float2) float2 texCoord  : TEXCOORD0; }; // main function - note C style definition // takes a position vector (float4) // returns a VS_OUTPUT struct VS_OUTPUT main( float4 inPos: POSITION ) { // declare an empty VS_OUTPUT to fill VS_OUTPUT o = (VS_OUTPUT) 0; // compute the sign of the input position inPos.xy = sign( inPos.xy); // set the output position using the xy of the input o.pos = float4( inPos.xy, 0.0f, 1.0f); // get into range [0,1] o.texCoord = (float2(o.pos.x, -o.pos.y) + 1.0f)/2.0f; return o; }

Точечное оттенение

Pixel shaders are applied for each pixel rendered to the screen. A pixel shader expects input from interpolated vertex values, which it then uses to rasterize the image. Pixel shaders can produce a huge range of effects involving the color of individual pixels such as refraction, per-pixel lighting or reflection.

A heavily commented example pixel shader, ready for use in Source is provided below.

Пример точечного оттенения

The pixel shader below is intended for use as a post-process shader and creates a grayscale effect.

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
// specify a texture sampler, the actual source of this is specified in a vmt sampler2D Texture0 : register( s0 );<br> // same function declaration style as vertex shaders // pixel shaders return the colour value of the pixel (hence the float4) float4 main( float2 texCoord  : TEXCOORD0 ) : COLOR { // sample the texture at the specified texture coordinates float4 tex = tex2D( Texture0, texCoord );<br> // greyscale the pixel colour values // - perform a dot product between the pixel colour and the specified vector // - 0.222, 0.707, 0.071 is found throughout image processing for gray scale effects. float4 grey = dot(float3(0.222, 0.707, 0.071), tex);<br> // return the pixel colour in the form of a float4. return grey; }

Наложение оттенений в Source

Платформа Source Source позволяет использовать два отличающихся вида оттенения, Постобработка и Объектное, большинство эффектов и материалов используемых на платформе Source Source в значительной степени определяются компонентами точечного оттенения.

Постобработка

Постобработка, это обычное Пиксельное оттенение применённое к прямоугольной области изображения, отображаемым по всему экрану. Прямоугольная область содержит копию из кадрового-буфера, Пиксельный оттенение может заменить и модифицировать выходное отображение, чтобы создать разнообразные эффекты, например, базовая модификация цвета для более продвинутых процессов, таких как размытие движения и свечение.

Note.pngПримечание: Эта информация не актуальна и файлы более не включены в SDK. 🖿sdk_bloom.cpp и 🖿sdk_bloom.ps20.fxc определяют одно возможное оттенение, которое может быть использовано, как альтернативный пример.

Source SDK предоставляет пример этого вида оттенения в файлах постобработки (🖿sdk_postprocess.cpp.cpp, 🖿sdk_postprocess_vs20.fxc, и 🖿sdk_postprocess_ps20.fxc)

Продвинутая постобработка, такая как свечение и размытие движения, интегрированны на платформе Source Source, могут пригодиться для создании пользовательских Целей Рендеринга(en)

Объектное

Объектное оттенение на платформе Source Source используется на любом объекте, если ссылка на оттенение указана в применяемом файле материала (.vmt)(en) , например модели или элементы карты. Объектное оттенение можно использовать для создания преломляющего материала, динамического изменения вершин модели или других расширенных эффектов отображения.

The Source SDK provides an example of a Per-Object shader in the lightmap files (🖿sdk_lightmap.cpp, 🖿sdk_lightmap_vs20.fxc, and 🖿sdk_lightmap_ps20.fxc)

Внешние ссылки