コンテンツにスキップ

GLSL

Xuất điển: フリー bách khoa sự điển 『ウィキペディア ( Wikipedia ) 』
GLSL
Thiết kế giả OpenGL ARB
Khai phát giả クロノス・グループ
Tối tân リリース 4.6/2017 niên 7 nguyệt 31 nhật(6 niên tiền )(2017-07-31)
Hình phó け Tĩnh đích hình phó け
Chủ な処 lý hệ glslangValidator, glslc
Ảnh hưởng を thụ けた ngôn ngữ C ngôn ngữ,C++
Ảnh hưởng を dữ えた ngôn ngữ Core Image Kernel Language[1],Android Graphics Shading Language (AGSL)[2]
プラットフォーム クロスプラットフォーム
ウェブサイト www.opengl.org
拡 trương tử glsl, vert, frag, geom, tesc, tese, comp
テンプレートを biểu kỳ
ビデオゲームはリアルタイムでレンダリングの kế toán をOpenGLKinh do でGPUにアウトソーシングする. シェーダーはOpenGL Shading Languageで thư かれ, コンパイルされる. コンパイルされたプログラムはGPUで thật hành される.

GLSL(OpenGLShading Language) はGLslangとしても tri られ,C ngôn ngữの cấu văn をベースとした cao レベルシェーディング ngôn ngữである. これはアセンブリ ngôn ngữやハードウェアに y tồn した ngôn ngữ を sử わないで,アプリケーションソフトウェアKhai phát giả がグラフィックスパイプラインを trực tiếp chế ngự できるようにOpenGL ARB (Architecture Review Board)[3]で sách định された.

Bối cảnh

[Biên tập]

Direct3D 7までの thời đại, すなわち1990 niên đại までのリアルタイム3Dコンピューターグラフィックスは, OpenGLやDirect3DといったAPIを thông して,グラフィックスカードThượng のチップ (GPU) にあらかじめ dụng ý された cố định のレンダリングパイプライン thượng で, cố định cơ năng のシェーダー ( đỉnh điểm トランスフォームや âm ảnh kế toán を chuyên môn に đam đương するユニット ) を tổ み hợp わせることで thật hiện されていた. Direct3D 8が đăng tràng した2000 niên dĩ hàng は, GPUの tiến hóa ・ tính năng hướng thượng に bạn い, tân cơ năng はハードウェア thật trang による cố định cơ năng ではなく, アプリケーション khai phát giả がソフトウェアプログラム (プログラマブルシェーダー) によって đỉnh điểm レベル・フラグメントレベル ( ピクセルレベル ) での chế ngự ・カスタマイズを hành ない, レンダリングパイプライン nội での nhu nhuyễn tính や biểu hiện lực を tăng すことができる hình で truy gia されることが đa くなっている.

Nguyên 々, このプログラマブルシェーディング cơ năng は phục tạp で trực cảm đích でないアセンブリ ngôn ngữで thư かれたシェーダーを sử わないと thật hiện できなかった. OpenGL ARBは,OpenGLをグラフィックス sản nghiệp の lịch sử の trung でオープンスタンダードなものにしていく trung で, グラフィックス処 lý を hành うプログラミングをより trực cảm đích ・ hiệu suất đích にできる phương pháp として, OpenGL Shading Languageを tác り xuất した.

OpenGL Shading Languageは2003 niên に phát biểu されたOpenGL 1.5の拡 trương cơ năng として đạo nhập された[4]が, OpenGL ARBはOpenGL 2.0にGLSLを hàm めることを chính thức に quyết định した. OpenGL 2.0は1992 niênに phát biểu されたOpenGL 1.0から sổ えて sơ のメジャーバージョンアップである.

Sơ kỳ のOpenGLプログラマブルシェーダーは, đỉnh điểm 単 vị のトランスフォームや âm ảnh kế toán を hành なうバーテックスシェーダー(vertex shader) と, フラグメント ( ピクセル ) 単 vị の âm ảnh kế toán を hành なうフラグメントシェーダー(fragment shader) のみが lợi dụng khả năng であった. その hậu,プリミティブ[5]の tăng giảm や変 canh などを thật hành できるジオメトリシェーダー(geometry shader) がOpenGL 3.2/GLSL 1.5にて tiêu chuẩn hóa された. またOpenGL 4.0で cố định cơ năng シェーダーであるテッセレーションステージが truy gia されるに bạn い,テッセレーション・コントロールシェーダー(tessellation control shader) と,テッセレーション・エバリュエーションシェーダー(tessellation evaluation shader), これら2つのプログラマブルなシェーダーがGLSLの sĩ dạng に truy gia された. フラグメントシェーダーもサンプルレベルでの chế ngự が khả năng となった.

なお, OpenGLと đồng dạng の3DグラフィックスAPIであるDirectX(Direct3D) およびそのシェーディング ngôn ngữ であるHLSLにはバージョン11 dĩ hàng, GPUにおける phiếm dụng đích なコンピューティング (GPGPU) を khả năng とするDirectX Compute Shader (DirectCompute) が truy gia されているが, OpenGLおよびGLSLのバージョン4.0 thời điểm ではこれに tương đương するシェーダーは hàm まれていなかった. しかし, バージョン4.3においてOpenGLコンピュートシェーダー(compute shader) として đồng đẳng cơ năng が đạo nhập されることになった. なお, コンピュートシェーダーの đạo nhập dĩ tiền からOpenGLの quản hạt を hành なっているクロノスが đồng dạng にオープン sĩ dạng として sách định している, GPUを phiếm dụng コンピューティングに dụng いることのできるAPIとしてOpenCLが tồn tại するが, こちらはCPUやGPU đẳng あらゆる kế toán tư nguyên を kế toán に dụng いることのできる dị chủng kế toán tư nguyên hỗn tại ( ヘテロジニアス ) hoàn cảnh hướng けのAPIであり, グラフィックスパイプラインとの liên huề を chủ mục đích としたコンピュートシェーダーとは đắc ý phân dã が nhược càn dị なる.

GLSLを sử うメリットとして,

  • レンダリングアルゴリズムの nhu nhuyễn なカスタマイズや tái lợi dụng tính が tăng すことで, 従 lai のハードウェア cố định cơ năng にとらわれない, nhu nhuyễn でユニークかつ cao phẩm chất なリアルタイム3DCGシーンの cấu trúc が khả năng となる.
  • MacintoshWindows,Linuxを hàm む phục sổ のOSGian での hỗ hoán tính を xác bảo できる.
  • アセンブリ ngôn ngữ を dụng いるよりもコードの tái lợi dụng tính やメンテナンス tính が tăng す.
  • OpenGL Shading LanguageをサポートするどんなハードウェアベンダーのGPU thượng でも động tác するシェーダーを thư くことができる năng lực を trì つ.
  • それぞれのハードウェアベンダーはデバイスドライバーNội にGLSLコンパイラを hàm めることができるので, そのGPUのアーキテクチャに tối thích hóa されたコードを sinh thành することができる.

などが cử げられる. 従 lai の cố định cơ năng シェーダーに đối するデメリットとしては,

  • シェーダーのコンパイルおよびアタッチなど, レンダリングのための chuẩn bị tác nghiệp が tăng える.
  • OpenGL APIの tha に, GLSLの học tập コストがかかる.
  • GPU đặc tính やハードウェア sĩ dạng を bả ác してGLSLコードを ký thuật する tất yếu があり, CPUと bỉ giác してチューニングが nan しい.

などが cử げられる.

なお, GLSLの phái sinh quy cách として, tổ み込み hoàn cảnh hướng けのOpenGL ESDụng のシェーダー ngôn ngữ “GLSL ES” が tồn tại する. これはESSLと hô ばれることもある[6].

WebブラウザHướng けのOpenGL ES phái sinh quy cách としてWebGLが tồn tại するが, WebGLでもGLSLが sử dụng される.

クロノスが sách định しているローレベルグラフィックスAPIであるVulkanは, シェーダープログラムの trung gian biểu hiện SPIR-Vを nhập lực として thụ け phó けるが, SPIR-Vを xuất lực するオフラインシェーダーコンパイラglslangValidatorにおいて tối sơ にサポートされた thượng vị レベルシェーディング ngôn ngữ はGLSLである. のちにSPIR-VはOpenGL 4.6にも đạo nhập された.

Tường tế

[Biên tập]

データ hình

[Biên tập]

OpenGL Shading Language 1.50の sĩ dạng では64の cơ bổn データ hình を định nghĩa している. いくつかはC ngôn ngữ nội で sử われていたものとまったく đồng じものであるが, nhất phương tha のものはグラフィックス処 lý に đặc hóa している. Lệ えば dĩ hạ のような hình が định nghĩa されている[7].

  • voidTrị を phản さない quan sổ に dụng いる
  • boolĐiều kiện hình. Trị はtrueかfalseのどちらかをとる
  • intPhù hào phó 32bit chỉnh sổ
  • float単 tinh độ phù động tiểu sổ điểm sổ
  • vec22 yếu tố を trì つ単 tinh độ phù động tiểu sổ điểm sổベクトル
  • vec33 yếu tố を trì つ単 tinh độ phù động tiểu sổ điểm sổ ベクトル
  • vec44 yếu tố を trì つ単 tinh độ phù động tiểu sổ điểm sổ ベクトル
  • bvec22 yếu tố を trì つ luận lý hình ベクトル
  • bvec33 yếu tố を trì つ luận lý hình ベクトル
  • bvec44 yếu tố を trì つ luận lý hình ベクトル
  • ivec22 yếu tố を trì つ phù hào phó 32bit chỉnh sổ ベクトル
  • ivec33 yếu tố を trì つ phù hào phó 32bit chỉnh sổ ベクトル
  • ivec44 yếu tố を trì つ phù hào phó 32bit chỉnh sổ ベクトル
  • mat22x2 yếu tố を trì つ単 tinh độ phù động tiểu sổ điểm sổHành liệt
  • mat33x3 yếu tố を trì つ単 tinh độ phù động tiểu sổ điểm sổ hành liệt
  • mat44x4 yếu tố を trì つ単 tinh độ phù động tiểu sổ điểm sổ hành liệt
  • sampler1D1 thứ nguyên のテクスチャにアクセスするためのハンドル
  • sampler2D2 thứ nguyên のテクスチャにアクセスするためのハンドル
  • sampler3D3 thứ nguyên のテクスチャにアクセスするためのハンドル
  • samplerCubeキューブマップテクスチャにアクセスするためのハンドル
  • sampler1DShadow1 thứ nguyên のデプステクスチャにアクセスするためのハンドル
  • sampler2DShadow2 thứ nguyên のデプステクスチャにアクセスするためのハンドル

なお, phù hào なし32bit chỉnh sổ のサポートはOpenGL 3.0 (GLSL 1.3) で tiêu chuẩn hóa され, また khoa học kế toán などの phân dã で tất yếu とされることの đa いBội tinh độ phù động tiểu sổ điểm sổのサポートはOpenGL 4.0 (GLSL 4.0) で tiêu chuẩn hóa されている.

Diễn toán tử

[Biên tập]

OpenGL Shanding LanguageはホストプログラムにC ngôn ngữ がよく sử われていることを bối cảnh にして, それによく tự た đa くの diễn toán tử, gia えてベクトル diễn toán に đặc hóa した đặc thù な diễn toán tử ( Tupleを phản すSwizzle diễn toán など ) も đề cung している. このことにより, シェーダー khai phát giả はシェーダーを nhu nhuyễn にかつ hiệu suất よく thư くことができる. GLSLはポインタを trừ くCやC++での diễn toán tử を hàm んでいる.

Quan sổ と chế ngự cấu tạo

[Biên tập]

GLSLは, C ngôn ngữ に kiến られるif/else if/else,for,while,do-while,break,continueなどの sào り phản しや phân kỳ といった chế ngự văn もサポートしている.

いくつかの tổ み込み quan sổ ( ビルトイン quan sổ ) のほか, ユーザー định nghĩa quan sổ もサポートしている. GPUベンダーは, tất yếu に ứng じて tổ み込み quan sổ の thật trang をハードウェアレベルで tối thích hóa することもできる. Tổ み込み quan sổ の đa くはexp()abs()のようなC ngôn ngữ の tiêu chuẩn ライブラリで kiến られるものとよく tự ているが, nhất phương でsmoothstep()texture2D()のようなグラフィックスプログラミングに đặc hóa しているようなものもある.

変 sổ

[Biên tập]

GLSLコード nội における変 sổ の tuyên ngôn ・ sử dụng phương pháp は, C ngôn ngữ でのそれに tự ている.

変 sổ の tu sức tử は4つある ( dĩ hạ バーテックスシェーダー, ジオメトリシェーダー, フラグメントシェーダーをそれぞれVS, GS, FSと kỳ す ).

  • const変 hóa しない.
  • uniformToàn てのシェーダーで sử dụng khả năng なグローバルな đọc み xuất し chuyên dụng 変 sổ.
  • inNhập lực 変 sổ. VSではOpenGLから độ される đỉnh điểm tình báo セットを biểu す ( cựuattribute). GSではVSによって kế toán された đỉnh điểm tình báo セット, FSではVSまたはGSによって kế toán された đỉnh điểm tình báo が bổ gian された trị を biểu す ( cựuvarying).
  • outXuất lực 変 sổ. VSではGSまたはFSへ ( cựuvarying), GSではFSへ độ す đỉnh điểm tình báo セットを biểu す. FSでは tối chung đích にピクセル単 vị で xuất lực する sắc tình báo を biểu す.
  • inoutNhập xuất lực 変 sổ.

シェーダーステージ

[Biên tập]

OpenGL 4.3 (GLSL 4.3) dĩ hàng, OpenGL ES 3.2 (GLSL ES 3.2) dĩ hàng, およびVulkan 1.0 dĩ hàng で, dĩ hạ の6 chủng loại のシェーダーステージに đối ứng している.

  • Đỉnh điểm シェーダー (vertex shader)
  • テッセレーション chế ngự シェーダー (tessellation control shader): GLSL 4.0 / GLSL ES 3.2で đối ứng
  • テッセレーション bình 価シェーダー (tessellation evaluation shader): GLSL 4.0 / GLSL ES 3.2で đối ứng
  • ジオメトリシェーダー (geometry shader): GLSL 1.5 / GLSL ES 3.2で đối ứng
  • フラグメントシェーダー (fragment shader)
  • コンピュートシェーダー (compute shader): GLSL 4.3 / GLSL ES 3.1で đối ứng

コンパイルと thật hành

[Biên tập]

GLSLシェーダープログラムは単 thể のアプリケーションではない. シェーダーの thật hành にはOpenGL APIを lợi dụng するホストアプリケーションが tất yếu である. ホストアプリケーションを ký thuật する ngôn ngữ には, OpenGL APIをサポートする đệ nhất cấp ngôn ngữ であるC ngôn ngữおよびC++,あるいはWebGLをサポートするJavaScriptなどがよく lợi dụng される.

従 lai phương thức では, GLSLシェーダーはOpenGL APIQuan sổを thông じて, ハードウェアベンダーの thật trang したデバイスドライバーThượng のオンラインコンパイラによってThật hành thời にコンパイルされる. GLSLシェーダープログラムのソースコードはホストプログラム thượng の văn tự liệt リテラルとして ký thuật されたり, アプリケーション thật hành thời に ngoại bộ テキストファイルなどから đọc み込まれたりしたものがメモリ thượng の văn tự liệt データとして thật thể hóa されるが, オフラインの sự tiền コンパイル phương thức ではなく, あくまでドライバーにはソースコード văn tự liệt の hình thức で tống られ, ドライバーが thật hành thời にシェーダーのソースコードをコンパイルして “シェーダープログラムオブジェクト” を sinh thành する. Cụ thể đích な thủ thuận として, アプリケーションはまずglCreateShader()で các シェーダーステージのシェーダーオブジェクトを sinh thành し, そのシェーダーオブジェクトに đối してGLSLソースコード văn tự liệt をglShaderSource()で thiết định した hậu,glCompileShader()によってシェーダーをコンパイルする. その hậu,glCreateProgram()で sinh thành したプログラムオブジェクトに đối して,glAttachShader()で tiền thuật のコンパイル tế みシェーダーオブジェクトを quan liên phó け,glLinkProgram()でリンクすることで, ようやく nhất liên のプログラマブルシェーダーパイプラインが hoàn thành する. シェーダープログラムを lợi dụng して miêu họa するには, miêu họa mệnh lệnh を phát hành する tiền にglUseProgram()で hiện tại のOpenGLコンテキストにプログラムオブジェクトをバインドしておく tất yếu がある.

シェーダープログラムのコンパイルやリンクは thời gian のかかる処 lý であり, アプリケーション sơ kỳ hóa のボトルネックとなりうるため, trực cận のソースコード văn tự liệt に đối ứng するコンパイル kết quả はドライバー trắc でキャッシュされる thật trang になっていることも đa い. なお, OpenGL 4.1で tiêu chuẩn hóa されたGL_ARB_get_program_binaryにより, コンパイル tế みバイナリのシリアライズ・ nghịch シリアライズが拡 trương としてサポートされるようになったが, バイナリがベンダー gian で hỗ hoán tính のある trung gian hình thức であるかどうかは bảo chứng されない. OpenGL 4.5で tiêu chuẩn hóa されたGL_ARB_parallel_shader_compileにより,マルチスレッドを lợi dụng したシェーダーの tịnh liệt コンパイルが拡 trương としてサポートされるようになった. デバイスドライバーがGLSLコンパイラを nội tàng していることから, ドライバーによってシェーダープログラムのコンパイル kết quả や thật hành kết quả が dị なる khả năng tính があるなどの phẩm chất vấn đề も bão えている.

OpenGL 4.6では trung gian biểu hiện SPIR-Vがサポートされるようになり, オフラインコンパイルが khả năng になったことから, OpenGLでプログラマブルシェーダーを lợi dụng するために tất ずしもGLSLを lợi dụng する tất yếu はなくなった. なお,Direct3Dのシェーディング ngôn ngữ であるHLSLはリリース đương sơ から, コンパイル kết quả はベンダー phi y tồn のバイトコードで xuất lực され, またコンパイル tế みバイナリの đọc み込みもサポートしていた.

単 thuần なGLSLバーテックスシェーダーの lệ

[Biên tập]

これは cố định cơ năng パイプラインと đồng dạng に nhập lực đỉnh điểm を変 hoán する.

voidmain(void)
{
gl_Position=ftransform();
}

ftransform()はGLSL 1.40とGLSL ES 1.0からはサポートされない. Đại わりに, プログラマは tân しいOpenGL 3.1 tiêu chuẩn に従いモデルビュー hành liệt と đầu ảnh hành liệt を minh kỳ đích に chỉ định する tất yếu がある.

#version 140
uniformmat4projectionMatrix;
uniformmat4modelviewMatrix;
invec3position;

voidmain(void)
{
gl_Position=projectionMatrix*modelviewMatrix*vec4(position,1.0);
}

単 thuần なGLSLジオメトリシェーダーの lệ

[Biên tập]
layout(triangles)in;
layout(triangle_strip,max_vertices=3)out;

inInput
{
vec4Position;
}VSout[3];

voidmain(void)
{
for(inti=0;i<3;i++)
{
gl_Position=VSout[i].Position;
EmitVertex();
}
EndPrimitive();
}

単 thuần なGLSLフラグメントシェーダーの lệ

[Biên tập]
voidmain(void)
{
gl_FragColor=vec4(1.0,0.0,0.0,1.0);// Red.
}

バージョン

[Biên tập]

GLSLはOpenGL sĩ dạng とともにバージョンアップされている. OpenGL 3.2までは, đối ứng するGLSLのバージョン phiên hào はOpenGL bổn thể のバージョン phiên hào と vô quan hệ にナンバリングされていたが, OpenGL 3.3 dĩ hàng は đồng nhất の phiên hào が cát り đương てられるようになった.

OpenGLバージョン GLSLバージョン #versionディレクティブ
1.5 1.0
2.0 1.1 #version 110
2.1 1.2 #version 120
3.0 1.3 #version 130
3.1 1.4 #version 140
3.2 1.5 #version 150
3.3 3.3 #version 330
4.0 4.0 #version 400
4.1 4.1 #version 410
4.2 4.2 #version 420
4.3 4.3 #version 430
4.4 4.4 #version 440
4.5 4.5 #version 450
4.6 4.6 #version 460

GLSL ESもOpenGL ES sĩ dạng とともに canh tân されている.

OpenGL ESバージョン GLSL ESバージョン #versionディレクティブ
2.0 1.0 #version 100
3.0 3.0 #version 300 es
3.1 3.1 #version 310 es
3.2 3.2 #version 320 es

ツール

[Biên tập]

GLSLシェーダーは単 độc で động tác するプログラムではなく, シェーダープログラムをGPU thượng で tẩu らせるためには, まずC/C++などで thư かれたホストアプリケーションに nhập lực する tất yếu がある. Cụ thể đích にはOpenGL APIを sử ってシェーダープログラムをコンパイル・リンクしたのち, OpenGLレンダリングコンテキストにプログラムオブジェクトをバインドしてからプリミティブのレンダリングを thật hành する tất yếu があるが, それらの nhất liên の処 lý を giản lược hóa するためにいくつかのGLSL khai phát giả ・デザイナー dụng ツール (オーサリングツール ) が tồn tại する.

  • RenderMonkey-ATIによって khai phát された.DirectXシェーダーと đồng dạng にGLSLシェーダーを tác thành, コンパイル, デバッグできるインタフェースを đề cung している.Microsoft WindowsThượng でのみ thật hành できる.GPUOpen(Anh ngữ bản)に di quản されているが, khai phát およびサポートは chung liễu している.
  • GLSLEditorSample -macOSThượng でのみ thật hành できるCocoaアプリケーション. シェーダーの tác thành とコンパイルはできるがデバッガ cơ năng は tổ み込まれていない.
  • Lumina- tân しいGLSL khai phát ツール. プラットフォーム độc lập でインタフェースにQtを sử っている.
  • Blender- GPLライセンスのモデリングおよびアニメーション tác thành パッケージで, バージョン2.4.1で nội tàng しているゲームエンジンがGLSLをサポートするようになった.
  • Mozilla Firefox- khai phát giả hướng けツールとして,WebGLDụng のバーテックスシェーダー・フラグメントシェーダーを tham chiếu ・ biên tập できる "シェーダーエディター" が thật trang されている[8].

Cước chú

[Biên tập]

Quan liên hạng mục

[Biên tập]