GLSL と HLSL の対応を示すリファレンスGLSL-to-HLSL reference
グラフィックス アーキテクチャを OpenGL ES 2.0 から Direct3D 11 に移植してユニバーサル Windows プラットフォーム (UWP) 向けのゲームを作成する際は、OpenGL シェーダー言語 (GLSL) コードを Microsoft 上位レベル シェーダー言語 (HLSL) コードに移植します。You port your OpenGL Shader Language (GLSL) code to Microsoft High Level Shader Language (HLSL) code when you port your graphics architecture from OpenGL ES 2.0 to Direct3D 11 to create a game for Universal Windows Platform (UWP). ここで参照される GLSL は OpenGL ES 2.0 とは互換性がありません。HLSL は Direct3D 11 と互換性があります。The GLSL that is referred to herein is compatible with OpenGL ES 2.0; the HLSL is compatible with Direct3D 11. Direct3D 11 と以前のバージョンの Direct3D の違いについては、「機能のマッピング」をご覧ください。For info about the differences between Direct3D 11 and previous versions of Direct3D, see Feature mapping.
- OpenGL ES 2.0 Direct3D とを比較する 11Comparing OpenGL ES 2.0 with Direct3D 11
- GLSL HLSL 変数の移植Porting GLSL variables to HLSL
- GLSL HLSL の種類の移植Porting GLSL types to HLSL
- HLSL のグローバル変数を事前に定義された GLSL の移植Porting GLSL pre-defined global variables to HLSL
- GLSL HLSL 変数への移植の例Examples of porting GLSL variables to HLSL
- Direct3D に OpenGL レンダリング コードの移植の例Examples of porting OpenGL rendering code to Direct3D
- 関連トピックRelated topics
OpenGL ES 2.0 と Direct3D 11 の比較Comparing OpenGL ES 2.0 with Direct3D 11
OpenGL ES 2.0 と Direct3D 11 には多くの類似点があります。OpenGL ES 2.0 and Direct3D 11 have many similarities. どちらも、類似したレンダリング パイプラインとグラフィックス機能があります。They both have similar rendering pipelines and graphics features. ただし、Direct3D 11 はレンダリングの実装と API であり、仕様ではありません。OpenGL ES 2.0 はレンダリングの仕様と API であり、実装ではありません。But Direct3D 11 is a rendering implementation and API, not a specification; OpenGL ES 2.0 is a rendering specification and API, not an implementation. Direct3D 11 と OpenGL ES 2.0 は通常、次の点で異なります。Direct3D 11 and OpenGL ES 2.0 generally differ in these ways:
OpenGL ES 2.0OpenGL ES 2.0 | Direct3D 11Direct3D 11 |
---|---|
ハードウェアやオペレーティング システムにとらわれない仕様とベンダーが提供する実装Hardware and operating system agnostic specification with vendor provided implementations | Windows プラットフォームのハードウェア アブストラクションと認定の Microsoft 実装Microsoft implementation of hardware abstraction and certification on Windows platforms |
多様なハードウェア向けに抽象化、ランタイムがほとんどのリソースを管理Abstracted for hardware diversity, runtime manages most resources | ハードウェアのレイアウトに直接アクセス。アプリがリソースと処理を管理できるDirect access to hardware layout; app can manage resources and processing |
サード パーティのライブラリ (たとえば、Simple DirectMedia Layer (SDL)) によって高レベルのモジュールを提供Provides higher-level modules via third-party libraries (for example, Simple DirectMedia Layer (SDL)) | Direct2D などの高レベルのモジュールは下位モジュールに基づいて構築されるため、Windows アプリの開発が簡略化Higher-level modules, like Direct2D, are built upon lower modules to simplify development for Windows apps |
ハードウェア ベンダーは拡張子によって区別Hardware vendors differentiate via extensions | Microsoft は、汎用的な方法で API にオプション機能を追加するため、特定のハードウェア ベンダーに限定されないMicrosoft adds optional features to the API in a generic way so they aren't specific to any particular hardware vendor |
GLSL と HLSL は一般に次の点で異なります。GLSL and HLSL generally differ in these ways:
GLSLGLSL | HLSLHLSL |
---|---|
手続き型、ステップ中心 (C など)Procedural, step-centric (C like) | オブジェクト指向、データ中心 (C++ など)Object oriented, data-centric (C++ like) |
グラフィックス API に統合されたシェーダー コンパイルShader compilation integrated into the graphics API | HLSL コンパイラが中間バイナリ表現にシェーダーをコンパイルし、その後で Direct3D がそれをドライバーに渡します。The HLSL compiler compiles the shader to an intermediate binary representation before Direct3D passes it to the driver.
注 このバイナリ表現はハードウェアに依存しません。
Note This binary representation is hardware independent. 通常はアプリの実行時ではなくアプリのビルド時にコンパイルされます。It's typically compiled at app build time, rather than at app run time.
|
変数ストレージ修飾子Variable storage modifiers | 入力レイアウトの宣言による定数バッファーとデータ転送Constant buffers and data transfers via input layout declarations |
一般的なベクター型: vec2/3/4Typical vector type: vec2/3/4 lowp、mediump、highplowp, mediump, highp |
一般的なベクター型: float2/3/4Typical vector type: float2/3/4 min10float、min16floatmin10float, min16float |
texture2D [Function]texture2D [Function] | texture.Sample [datatype.Function]texture.Sample [datatype.Function] |
sampler2D [datatype]sampler2D [datatype] | Texture2D [datatype]Texture2D [datatype] |
行優先マトリックス (既定)Row-major matrices (default) | 列優先マトリックス (既定)Column-major matrices (default)
注 使用、 row_major型修飾子で 1 つの変数のレイアウトを変更します。
Note Use the row_major type-modifier to change the layout for one variable. 詳しくは、「変数の構文」をご覧ください。For more info, see Variable Syntax. コンパイラ フラグまたはプラグマを指定してグローバルな既定値を変更することもできます。You can also specify a compiler flag or a pragma to change the global default.
|
フラグメント シェーダーFragment shader | ピクセル シェーダーPixel shader |
注 HLSL がテクスチャおよびサンプラーとして 2 つのオブジェクト。Note HLSL has textures and samplers as two separate objects. GLSL では、Direct3D 9 と同様に、テクスチャのバインドはサンプラーの状態の一部です。In GLSL, like Direct3D 9, the texture binding is part of the sampler state.
GLSL では、事前定義されたグローバル変数として OpenGL の状態の多くを示します。In GLSL, you present much of the OpenGL state as pre-defined global variables. たとえば、GLSL でを使用する、 gl_位置頂点の位置を指定する変数とgl_FragColorフラグメントの色を指定する変数。For example, with GLSL, you use the gl_Position variable to specify vertex position and the gl_FragColor variable to specify fragment color. HLSL では、アプリ コードからシェーダーに Direct3D の状態を明示的に渡します。In HLSL, you pass Direct3D state explicitly from the app code to the shader. たとえば、Direct3D と HLSL を使う場合は、頂点シェーダーへの入力が頂点バッファーのデータ形式に一致し、アプリ コードの定数バッファーの構造がシェーダー コードの定数バッファー (cbuffer) の構造と一致する必要があります。For example, with Direct3D and HLSL, the input to the vertex shader must match the data format in the vertex buffer, and the structure of a constant buffer in the app code must match the structure of a constant buffer (cbuffer) in shader code.
HLSL への GLSL 変数の移植Porting GLSL variables to HLSL
GLSL では、グローバル シェーダーの変数の宣言に修飾子を適用し、その変数にシェーダーの特定の動作を割り当てます。In GLSL, you apply modifiers (qualifiers) to a global shader variable declaration to give that variable a specific behavior in your shaders. HLSL では、シェーダーとやり取りする引数を使ってシェーダーのフローを定義するため、これらの修飾子は必要ではありません。In HLSL, you don’t need these modifiers because you define the flow of the shader with the arguments that you pass to your shader and that you return from your shader.
GLSL の変数の動作GLSL variable behavior | 相当する HLSL の要素HLSL equivalent |
---|---|
uniformuniform アプリ コードから uniform 変数を頂点シェーダーとフラグメント シェーダーのどちらか一方または両方に渡します。You pass a uniform variable from the app code into either or both vertex and fragment shaders. これらのシェーダーを使って三角形を描画する前にすべての uniform の値を設定する必要があります。三角形のメッシュの描画中に値が変わらないようにするためです。You must set the values of all uniforms before you draw any triangles with those shaders so their values stay the same throughout the drawing of a triangle mesh. これらの値は変化しません。These values are uniform. フレーム全体に対して設定される uniform もあれば、特定の頂点ピクセル シェーダーのペアに対してのみ設定される uniform もあります。Some uniforms are set for the entire frame and others uniquely to one particular vertex-pixel shader pair. uniform 変数はポリゴン単位の変数です。Uniform variables are per-polygon variables. |
定数バッファーを使います。Use constant buffer. 「定数バッファーを作成とシェーダー定数します。See How to: Create a Constant Buffer and Shader Constants. |
さまざまなvarying 頂点シェーダー内で varying 変数を初期化し、フラグメント シェーダーの同じ名前の varying 変数に渡します。You initialize a varying variable inside the vertex shader and pass it through to an identically named varying variable in the fragment shader. 頂点シェーダーは各頂点でのみさまざまな変数の値を設定するため、ラスタライザーはその値を (透視補正の方法で) 補間し、フラグメント単位の値を生成してフラグメント シェーダーに渡します。Because the vertex shader only sets the value of the varying variables at each vertex, the rasterizer interpolates those values (in a perspective-correct manner) to generate per fragment values to pass into the fragment shader. これらの変数は各三角形で異なります。These variables vary across each triangle. |
頂点シェーダーから取得した構造をピクセル シェーダーへの入力として使います。Use the structure that you return from your vertex shader as the input to your pixel shader. セマンティック値が一致することを確かめてください。Make sure the semantic values match. |
attributeattribute 属性は、アプリ コードから頂点シェーダーだけに渡す頂点の記述の一部です。An attribute is a part of the description of a vertex that you pass from the app code to the vertex shader alone. uniform とは異なり、頂点ごとに各属性の値を設定します。それにより、各頂点が異なる値を持つことができるようになります。Unlike a uniform, you set each attribute’s value for each vertex, which, in turn, allows each vertex to have a different value. 属性変数は頂点単位の変数です。Attribute variables are per-vertex variables. |
Direct3D アプリ コードで頂点バッファーを定義し、頂点シェーダーで定義されている頂点の入力と一致させます。Define a vertex buffer in your Direct3D app code and match it to the vertex input defined in the vertex shader. 必要に応じてインデックス バッファーを定義します。Optionally, define an index buffer. 「頂点バッファーを作成と方法。インデックス バッファーを作成です。See How to: Create a Vertex Buffer and How to: Create an Index Buffer. Direct3D アプリ コードで入力レイアウトを作成し、セマンティック値を頂点の入力の値と一致させます。Create an input layout in your Direct3D app code and match semantic values with those in the vertex input. 「入力レイアウトの作成」をご覧ください。See Create the input layout. |
constconst シェーダーにコンパイルされ、変更されない定数。Constants that are compiled into the shader and never change. |
static const を使用します。Use a static const. static は、値が定数バッファーに公開されないことを表し、const は、シェーダーが値を変更できないことを表します。static means the value isn't exposed to constant buffers, const means the shader can't change the value. そのため、値は初期化子に基づいてコンパイル時に把握されます。So, the value is known at compile time based on its initializer. |
GLSL では、修飾子のない変数は、各シェーダーに対してプライベートな通常のグローバル変数に過ぎません。In GLSL, variables without modifiers are just ordinary global variables that are private to each shader.
テクスチャ (HLSL での Texture2D) と関連のサンプラー (HLSL での SamplerState) にデータを渡すときに、通常は、ピクセル シェーダーのグローバル変数としてこれらを宣言します。When you pass data to textures (Texture2D in HLSL) and their associated samplers (SamplerState in HLSL), you typically declare them as global variables in the pixel shader.
HLSL への GLSL の型の移植Porting GLSL types to HLSL
HLSL に GLSL の型を移植する場合は、次の表を参考にしてください。Use this table to port your GLSL types to HLSL.
GLSL の型GLSL type | HLSL の型HLSL type |
---|---|
スカラー型: float、int、boolscalar types: float, int, bool | スカラー型: float、int、boolscalar types: float, int, bool また、uint、doublealso, uint, double 詳しくは、「スカラー型」をご覧ください。For more info, see Scalar Types. |
ベクター型vector type
|
ベクター型vector type
詳しくは、「ベクター型」と「キーワード」をご覧ください。For more info, see Vector Type and Keywords. vector は、float4 として定義される型でもあります (typedef vector <float, 4> vector;)。vector is also type defined as float4 (typedef vector <float, 4> vector;). 詳しくは、「ユーザー定義型」をご覧ください。For more info, see User-Defined Type. |
マトリックス型matrix type
|
マトリックス型matrix type
また、マトリックスの定義にマトリックス型を使うこともできます。You can also use the matrix type to define a matrix. 例: matrix <float, 2, 2> fMatrix = {0.0f, 0.1, 2.1f, 2.2f};For example: matrix <float, 2, 2> fMatrix = {0.0f, 0.1, 2.1f, 2.2f}; matrix は、float4x4 として定義される型でもあります (typedef matrix <float, 4, 4> matrix;)。matrix is also type defined as float4x4 (typedef matrix <float, 4, 4> matrix;). 詳しくは、「ユーザー定義型」をご覧ください。For more info, see User-Defined Type. |
float、int、sampler の有効桁数修飾子precision qualifiers for float, int, sampler
|
有効桁数の型precision types
詳しくは、「スカラー型」と「HLSL の最小精度の使用」をご覧ください。For more info, see Scalar Types and Using HLSL minimum precision. |
sampler2Dsampler2D | Texture2DTexture2D |
samplerCubesamplerCube | TextureCubeTextureCube |
HLSL への GLSL の定義済みグローバル変数の移植Porting GLSL pre-defined global variables to HLSL
GLSL の定義済みグローバル変数を HLSL に移植する場合は、次の表を参考にしてください。Use this table to port GLSL pre-defined global variables to HLSL.
GLSL の定義済みグローバル変数GLSL pre-defined global variable | HLSL セマンティクスHLSL semantics |
---|---|
gl_Positiongl_Position この変数は vec4 型です。This variable is type vec4. 頂点の位置Vertex position 例: gl_Position = position;for example - gl_Position = position; |
SV_PositionSV_Position Direct3D 9 の POSITIONPOSITION in Direct3D 9 このセマンティックは float4 型です。This semantic is type float4. 頂点シェーダーの出力Vertex shader output 頂点の位置Vertex position たとえば、float4 vPosition:SV_Position;for example - float4 vPosition : SV_Position; |
gl_PointSizegl_PointSize この変数は float 型です。This variable is type float. ポイントのサイズPoint size |
PSIZEPSIZE Direct3D 9 を対象としない場合、意味はありませんNo meaning unless you target Direct3D 9 このセマンティックは float 型です。This semantic is type float. 頂点シェーダーの出力Vertex shader output ポイントのサイズPoint size |
gl_FragColorgl_FragColor この変数は vec4 型です。This variable is type vec4. フラグメント色Fragment color 例: gl_FragColor = vec4(colorVarying, 1.0);for example - gl_FragColor = vec4(colorVarying, 1.0); |
SV_TargetSV_Target Direct3D 9 の COLORCOLOR in Direct3D 9 このセマンティックは float4 型です。This semantic is type float4. ピクセル シェーダーの出力Pixel shader output ピクセルの色Pixel color 例 - float4 色 [4]。SV_Target;for example - float4 Color[4] : SV_Target; |
gl_FragData[n]gl_FragData[n] この変数は vec4 型です。This variable is type vec4. カラー アタッチメント n のフラグメント色Fragment color for color attachment n |
SV_Target[n]SV_Target[n] このセマンティックは float4 型です。This semantic is type float4. n レンダー ターゲットに格納されるピクセル シェーダーの出力値 (0 <= n <= 7)。Pixel shader output value that is stored in n render target, where 0 <= n <= 7. |
gl_FragCoordgl_FragCoord この変数は vec4 型です。This variable is type vec4. フレーム バッファー内のフラグメントの位置Fragment position within frame buffer |
SV_PositionSV_Position Direct3D 9 では使用できませんNot available in Direct3D 9 このセマンティックは float4 型です。This semantic is type float4. ピクセル シェーダーの入力Pixel shader input 画面領域の座標Screen space coordinates 例 - float4 スクリーン空間。SV_Positionfor example - float4 screenSpace : SV_Position |
gl_FrontFacinggl_FrontFacing この変数は bool 型です。This variable is type bool. フラグメントが前向きのプリミティブに属しているかどうかを決定します。Determines whether fragment belongs to a front-facing primitive. |
SV_IsFrontFaceSV_IsFrontFace Direct3D 9 の VFACEVFACE in Direct3D 9 SV_IsFrontFace は bool 型です。SV_IsFrontFace is type bool. VFACE は float 型です。VFACE is type float. ピクセル シェーダーの入力Pixel shader input プリミティブの向きPrimitive facing |
gl_PointCoordgl_PointCoord この変数は vec2 型です。This variable is type vec2. ポイント内のフラグメントの位置 (ポイントのラスター化のみ)Fragment position within a point (point rasterization only) |
SV_PositionSV_Position Direct3D 9 の VPOSVPOS in Direct3D 9 SV_Position は float4 型です。SV_Position is type float4. VPOS は float2 型です。VPOS is type float2. ピクセル シェーダーの入力Pixel shader input 画面領域のピクセルまたはサンプルの位置The pixel or sample position in screen space たとえば、float4 pos:SV_Positionfor example - float4 pos : SV_Position |
gl_FragDepthgl_FragDepth この変数は float 型です。This variable is type float. 深度バッファーのデータDepth buffer data |
SV_DepthSV_Depth Direct3D 9 の DEPTHDEPTH in Direct3D 9 SV_Depth は float 型です。SV_Depth is type float. ピクセル シェーダーの出力Pixel shader output 深度バッファーのデータDepth buffer data |
頂点シェーダーの入力とピクセル シェーダーの入力に位置や色などを指定するには、セマンティクスを使います。You use semantics to specify position, color, and so on for vertex shader input and pixel shader input. 入力レイアウトのセマンティクス値と頂点シェーダーの入力を一致させる必要があります。You must match the semantics values in the input layout with the vertex shader input. 例については、「HLSL への GLSL 変数の移植の例」をご覧ください。For examples, see Examples of porting GLSL variables to HLSL. HLSL セマンティクスについて詳しくは、「セマンティクス」をご覧ください。For more info about the HLSL semantics, see Semantics.
HLSL への GLSL 変数の移植の例Examples of porting GLSL variables to HLSL
ここでは、OpenGL/GLSL コードの GLSL 変数の使用例と、Direct3D/HLSL コードでの相当する例を紹介します。Here we show examples of using GLSL variables in OpenGL/GLSL code and then the equivalent example in Direct3D/HLSL code.
GLSL での uniform、attribute、および varyingUniform, attribute, and varying in GLSL
OpenGL のアプリ コードOpenGL app code
// Uniform values can be set in app code and then processed in the shader code.
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
// Incoming position of vertex
attribute vec4 position;
// Incoming color for the vertex
attribute vec3 color;
// The varying variable tells the shader pipeline to pass it
// on to the fragment shader.
varying vec3 colorVarying;
GLSL の頂点シェーダー コードGLSL vertex shader code
//The shader entry point is the main method.
void main()
{
colorVarying = color; //Use the varying variable to pass the color to the fragment shader
gl_Position = position; //Copy the position to the gl_Position pre-defined global variable
}
GLSL のフラグメント シェーダー コードGLSL fragment shader code
void main()
{
//Pad the colorVarying vec3 with a 1.0 for alpha to create a vec4 color
//and assign that color to the gl_FragColor pre-defined global variable
//This color then becomes the fragment's color.
gl_FragColor = vec4(colorVarying, 1.0);
}
HLSL での定数バッファーとデータ転送Constant buffers and data transfers in HLSL
データを HLSL の頂点シェーダーに渡し、それがピクセル シェーダーに渡されるしくみの例を示します。Here is an example of how you pass data to the HLSL vertex shader that then flows through to the pixel shader. アプリ コードでは、頂点と定数バッファーを定義します。In your app code, define a vertex and a constant buffer. 次に、頂点シェーダー コードで、定数バッファーを cbuffer として定義し、頂点単位のデータとピクセル シェーダーの入力データを格納します。Then, in your vertex shader code, define the constant buffer as a cbuffer and store the per-vertex data and the pixel shader input data. ここでは、VertexShaderInput および PixelShaderInput と呼ばれる構造を使います。Here we use structures called VertexShaderInput and PixelShaderInput.
Direct3D のアプリ コードDirect3D app code
struct ConstantBuffer
{
XMFLOAT4X4 model;
XMFLOAT4X4 view;
XMFLOAT4X4 projection;
};
struct SimpleCubeVertex
{
XMFLOAT3 pos; // position
XMFLOAT3 color; // color
};
// Create an input layout that matches the layout defined in the vertex shader code.
const D3D11_INPUT_ELEMENT_DESC basicVertexLayoutDesc[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
// Create vertex and index buffers that define a geometry.
HLSL の頂点シェーダー コードHLSL vertex shader code
cbuffer ModelViewProjectionCB : register( b0 )
{
matrix model;
matrix view;
matrix projection;
};
// The POSITION and COLOR semantics must match the semantics in the input layout Direct3D app code.
struct VertexShaderInput
{
float3 pos : POSITION; // Incoming position of vertex
float3 color : COLOR; // Incoming color for the vertex
};
struct PixelShaderInput
{
float4 pos : SV_Position; // Copy the vertex position.
float4 color : COLOR; // Pass the color to the pixel shader.
};
PixelShaderInput main(VertexShaderInput input)
{
PixelShaderInput vertexShaderOutput;
// shader source code
return vertexShaderOutput;
}
HLSL のピクセル シェーダー コードHLSL pixel shader code
// Collect input from the vertex shader.
// The COLOR semantic must match the semantic in the vertex shader code.
struct PixelShaderInput
{
float4 pos : SV_Position;
float4 color : COLOR; // Color for the pixel
};
// Set the pixel color value for the renter target.
float4 main(PixelShaderInput input) : SV_Target
{
return input.color;
}
Direct3D への OpenGL のレンダリング コードの移植例Examples of porting OpenGL rendering code to Direct3D
ここでは、OpenGL ES 2.0 コードのレンダリングの例と、Direct3D 11 コードでの相当する例を紹介します。Here we show an example of rendering in OpenGL ES 2.0 code and then the equivalent example in Direct3D 11 code.
OpenGL のレンダリング コードOpenGL rendering code
// Bind shaders to the pipeline.
// Both vertex shader and fragment shader are in a program.
glUseProgram(m_shader->getProgram());
// Input asssembly
// Get the position and color attributes of the vertex.
m_positionLocation = glGetAttribLocation(m_shader->getProgram(), "position");
glEnableVertexAttribArray(m_positionLocation);
m_colorLocation = glGetAttribColor(m_shader->getProgram(), "color");
glEnableVertexAttribArray(m_colorLocation);
// Bind the vertex buffer object to the input assembler.
glBindBuffer(GL_ARRAY_BUFFER, m_geometryBuffer);
glVertexAttribPointer(m_positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, m_colorBuffer);
glVertexAttribPointer(m_colorLocation, 3, GL_FLOAT, GL_FALSE, 0, NULL);
// Draw a triangle with 3 vertices.
glDrawArray(GL_TRIANGLES, 0, 3);
Direct3D のレンダリング コードDirect3D rendering code
// Bind the vertex shader and pixel shader to the pipeline.
m_d3dDeviceContext->VSSetShader(vertexShader.Get(),nullptr,0);
m_d3dDeviceContext->PSSetShader(pixelShader.Get(),nullptr,0);
// Declare the inputs that the shaders expect.
m_d3dDeviceContext->IASetInputLayout(inputLayout.Get());
m_d3dDeviceContext->IASetVertexBuffers(0, 1, vertexBuffer.GetAddressOf(), &stride, &offset);
// Set the primitive's topology.
m_d3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Draw a triangle with 3 vertices. triangleVertices is an array of 3 vertices.
m_d3dDeviceContext->Draw(ARRAYSIZE(triangleVertices),0);
関連トピックRelated topics
フィードバック
フィードバックを読み込んでいます...