인 포트Port the GLSL

중요 APIImportant APIs

버퍼 및 셰이더 개체를 만들고 구성 하는 코드를 이동한 후에는 OpenGL ES 2.0의 HLSL (High level Shader language)에서 해당 셰이더 안에 있는 코드를 해당 셰이더로 이식 해야 합니다.Once you've moved over the code that creates and configures your buffers and shader objects, it's time to port the code inside those shaders from OpenGL ES 2.0's GL Shader Language (GLSL) to Direct3D 11's High-level Shader Language (HLSL).

OpenGL ES 2.0에서 셰이더는 gl _ 위치, gl _ FragColor또는 **gl _ FragData [ n ] ** 과 같은 내장 함수를 사용 하 여 실행 후 데이터를 반환 합니다. 여기서 n은 특정 렌더링 대상의 인덱스입니다.In OpenGL ES 2.0, shaders return data after execution using intrinsics such as gl_Position, gl_FragColor, or gl_FragData[n] (where n is the index for a specific render target). Direct3D에서는 특정 내장 함수를 사용할 수 없으며 셰이더는 해당 main () 함수의 반환 형식으로 데이터를 반환 합니다.In Direct3D, there are no specific intrinsics, and the shaders return data as the return type of their respective main() functions.

꼭 짓 점 위치 또는 일반 등 셰이더 단계 사이에 보간된 데이터는 다양 한 선언을 사용 하 여 처리 됩니다.Data that you want interpolated between shader stages, such as the vertex position or normal, is handled through the use of the varying declaration. 그러나 Direct3D에는이 선언이 없습니다. 대신 셰이더 단계 간에 전달 하려는 모든 데이터를 HLSL 의미 체계로 표시 해야 합니다.However, Direct3D doesn't have this declaration; rather, any data that you want passed between shader stages must be marked with an HLSL semantic. 선택한 특정 의미 체계는 데이터의 용도를 나타내며은입니다.The specific semantic chosen indicates the purpose of the data, and is. 예를 들어 조각 셰이더 사이에 보간된 꼭 짓 점 데이터를 다음과 같이 선언 합니다.For example, you'd declare vertex data that you want interpolated between the fragment shader as:

float4 vertPos : POSITION;

또는or

float4 vertColor : COLOR;

여기서 POSITION은 꼭 짓 점 위치 데이터를 나타내는 데 사용 되는 의미입니다.Where POSITION is the semantic used to indicate vertex position data. 또한 위치는 보간 후에 픽셀 셰이더에 액세스할 수 없기 때문에 특수 한 경우입니다.POSITION is also a special case, since after interpolation, it cannot be accessed by the pixel shader. 따라서 SV 위치를 사용 하 여 픽셀 셰이더에 대 한 입력을 지정 해야 _ 하며 보간된 꼭 짓 점 데이터가 해당 변수에 배치 됩니다.Therefore, you must specify input to the pixel shader with SV_POSITION and the interpolated vertex data will be placed in that variable.

float4 position : SV_POSITION;

의미 체계는 셰이더의 본문 (main) 메서드에서 선언할 수 있습니다.Semantics can be declared on the body (main) methods of shaders. 픽셀 셰이더의 경우 _ [ ] 본문 메서드에 렌더링 대상을 나타내는 SV 대상 n이 필요 합니다.For pixel shaders, SV_TARGET[n], which indicates a render target, is required on the body method. (SV _ 숫자 접미사가 없는 대상은 기본값 렌더링 대상 인덱스 0입니다.(SV_TARGET without a numeric suffix defaults to render target index 0.)

또한, 꼭 짓 점 셰이더는 SV _ POSITION 시스템 값 의미 체계를 출력 하는 데 필요 합니다.Also note that vertex shaders are required to output the SV_POSITION system value semantic. 이 의미 체계는 x가-1과 1 사이에 있는 값을 조정 하기 위해 꼭 짓 점 위치 데이터를 확인 하 고, y는-1과 1 사이, z는 원래의 유형이 같은 좌표 w 값 (z/w)으로 나눈 후 w는 1을 원래 w 값 (1/w)으로 나눕니다.This semantic resolves the vertex position data to coordinate values where x is between -1 and 1, y is between -1 and 1, z is divided by the original homogeneous coordinate w value (z/w), and w is 1 divided by the original w value (1/w). 픽셀 셰이더는 SV _ POSITION 시스템 값 의미 체계를 사용 하 여 화면에서 픽셀 위치를 검색 합니다. 여기서 x는 0 사이이 고 렌더링 대상 너비는 0이 고 y는 렌더링 대상 높이 (0.5)입니다.Pixel shaders use the SV_POSITION system value semantic to retrieve the pixel location on the screen, where x is between 0 and the render target width and y is between 0 and the render target height (each offset by 0.5). 기능 수준 9 _ x 픽셀 셰이더는 SV 위치 값에서 읽을 수 없습니다 _ .Feature level 9_x pixel shaders cannot read from the SV_POSITION value.

상수 버퍼는 cbuffer 를 사용 하 여 선언 되 고 조회를 위해 특정 시작 레지스터와 연결 되어야 합니다.Constant buffers must be declared with cbuffer and be associated with a specific starting register for lookup.

Direct3D 11: HLSL 상수 버퍼 선언Direct3D 11: An HLSL constant buffer declaration

cbuffer ModelViewProjectionConstantBuffer : register(b0)
{
  matrix mvp;
};

여기서 상수 버퍼는 압축 된 버퍼를 보관 하기 위해 등록 b0을 사용 합니다.Here, the constant buffer uses register b0 to hold the packed buffer. 모든 레지스터는 b 형식에서 참조 됩니다 # .All registers are referred to in the form b#. 상수 버퍼, 레지스터 및 데이터 압축의 HLSL 구현에 대 한 자세한 내용은 셰이더 상수 (HLSL)를 참조 하세요.For more information on the HLSL implementation of constant buffers, registers, and data packing, read Shader Constants (HLSL).

InstructionsInstructions

1 단계: 꼭 짓 점 셰이더 이식Step 1: Port the vertex shader

간단한 OpenGL ES 2.0 예제에서 꼭 짓 점 셰이더는 상수 모델-뷰-프로젝션 4x4 매트릭스와 4 좌표 벡터의 세 가지 입력을 포함 합니다.In our simple OpenGL ES 2.0 example, the vertex shader has three inputs: a constant model-view-projection 4x4 matrix, and two 4-coordinate vectors. 이러한 두 벡터에는 꼭 짓 점 위치와 색이 포함 됩니다.These two vectors contain the vertex position and its color. 셰이더는 위치 벡터를 큐브 뷰 좌표로 변환 하 고 _ 래스터화의 gl 위치 내장 함수에 할당 합니다.The shader transforms the position vector to perspective coordinates and assigns it to the gl_Position intrinsic for rasterization. 꼭 짓 점 색은 래스터화 중에 보간에 대해 다양 한 변수에 복사 됩니다.The vertex color is copied to a varying variable for interpolation during rasterization, as well.

OpenGL ES 2.0: 큐브 개체에 대 한 꼭 짓 점 셰이더 (글 안)OpenGL ES 2.0: Vertex shader for the cube object (GLSL)

uniform mat4 u_mvpMatrix; 
attribute vec4 a_position;
attribute vec4 a_color;
varying vec4 destColor;

void main()
{           
  gl_Position = u_mvpMatrix * a_position;
  destColor = a_color;
}

이제 Direct3D에서 상수 model-view-projection 행렬이 레지스터 b0에서 압축된 상수 버퍼에 포함되어 있으며, 꼭짓점 위치 및 색상은 적절한 해당 HLSL 의미 체계 POSITION 및 COLOR로 구체적으로 표시됩니다.Now, in Direct3D, the constant model-view-projection matrix is contained in a constant buffer packed at register b0, and the vertex position and color are specifically marked with the appropriate respective HLSL semantics: POSITION and COLOR. 입력 레이아웃은 이러한 두 꼭 짓 점 값의 특정 정렬을 나타내므로이를 포함 하는 구조체를 만들고 셰이더 본문 함수 (main)의 입력 매개 변수에 대 한 형식으로 선언 합니다.Since our input layout indicates a specific arrangement of these two vertex values, you create a struct to hold them and declare it as the type for the input parameter on the shader body function (main). (두 개의 개별 매개 변수로 지정할 수도 있지만이 경우 복잡할 수 있습니다.) 또한 보간된 위치 및 색을 포함 하는이 단계에 대 한 출력 형식을 지정 하 고 꼭 짓 점 셰이더의 본문 함수의 반환 값으로 선언 합니다.(You could also specify them as two individual parameters, but that could get cumbersome.) You also specify an output type for this stage, which contains the interpolated position and color, and declare it as the return value for the body function of the vertex shader.

Direct3D 11: 큐브 개체에 대 한 꼭 짓 점 셰이더 (HLSL)Direct3D 11: Vertex shader for the cube object (HLSL)

cbuffer ModelViewProjectionConstantBuffer : register(b0)
{
  matrix mvp;
};

// Per-vertex data used as input to the vertex shader.
struct VertexShaderInput
{
  float3 pos : POSITION;
  float3 color : COLOR;
};

// Per-vertex color data passed through the pixel shader.
struct PixelShaderInput
{
  float3 pos : SV_POSITION;
  float3 color : COLOR;
};

PixelShaderInput main(VertexShaderInput input)
{
  PixelShaderInput output;
  float4 pos = float4(input.pos, 1.0f); // add the w-coordinate

  pos = mul(mvp, projection);
  output.pos = pos;

  output.color = input.color;

  return output;
}

출력 데이터 형식 PixelShaderInput는 래스터화 중에 채워지고 조각 (픽셀) 셰이더에 제공 됩니다.The output data type, PixelShaderInput, is populated during rasterization and provided to the fragment (pixel) shader.

2 단계: 조각 셰이더 이식Step 2: Port the fragment shader

이 글의 예제 조각 셰이더는 매우 간단 _ 합니다. 보간된 색 값으로 gl FragColor 내장 함수를 제공 합니다.Our example fragment shader in GLSL is extremely simple: provide the gl_FragColor intrinsic with the interpolated color value. OpenGL ES 2.0는이를 기본 렌더링 대상에 기록 합니다.OpenGL ES 2.0 will write it to the default render target.

OpenGL ES 2.0: 큐브 개체에 대 한 조각 셰이더 (글 안)OpenGL ES 2.0: Fragment shader for the cube object (GLSL)

varying vec4 destColor;

void main()
{
  gl_FragColor = destColor;
} 

Direct3D는 거의 단순 합니다.Direct3D is almost as simple. 유일한 차이점은 픽셀 셰이더의 본문 함수가 값을 반환 해야 한다는 것입니다.The only significant difference is that the body function of the pixel shader must return a value. 색이 RGBA (4 좌표) 부동 소수점 값 이므로 반환 형식으로 float4을 표시 한 다음 기본 렌더링 대상을 SV _ 대상 시스템 값 의미 체계로 지정 합니다.Since the color is a 4-coordinate (RGBA) float value, you indicate float4 as the return type, and then specify the default render target as the SV_TARGET system value semantic.

Direct3D 11: cube 개체의 픽셀 셰이더 (HLSL)Direct3D 11: Pixel shader for the cube object (HLSL)

struct PixelShaderInput
{
  float4 pos : SV_POSITION;
  float3 color : COLOR;
};


float4 main(PixelShaderInput input) : SV_TARGET
{
  return float4(input.color, 1.0f);
}

위치의 픽셀 색은 렌더링 대상에 기록 됩니다.The color for the pixel at the position is written to the render target. 이제 화면에 그릴때 렌더링 대상의 콘텐츠를 표시 하는 방법을 알아보겠습니다.Now, let's see how to display the contents of that render target in Draw to the screen!

이전 단계Previous step

꼭 짓 점 버퍼 및 데이터를 이식 합니다 . 다음 단계Port the vertex buffers and data Next step

화면에 그리기 설명Draw to the screen Remarks

HLSL 의미 체계를 이해 하 고 상수 버퍼를 압축 하면 약간의 디버깅 골칫거리을 제공할 수 있을 뿐 아니라 최적화 기회를 제공할 수 있습니다.Understanding HLSL semantics and the packing of constant buffers can save you a bit of a debugging headache, as well as provide optimization opportunities. HLSL (변수 구문), Direct3D 11의 버퍼 소개방법: 상수 버퍼 만들기를 참조 하세요.If you get a chance, read through Variable Syntax (HLSL), Introduction to Buffers in Direct3D 11, and How to: Create a Constant Buffer. 그러나 그렇지 않은 경우에는 의미 체계 및 상수 버퍼를 염두에 두어야 하는 몇 가지 시작 팁이 있습니다.If not, though, here's a few starting tips to keep in mind about semantics and constant buffers:

  • 항상 렌더러의 Direct3D 구성 코드를 다시 확인 하 여 상수 버퍼의 구조가 HLSL의 cbuffer 구조체 선언과 일치 하는지, 그리고 구성 요소 스칼라 형식이 두 선언에서 일치 하는지 확인 합니다.Always double check your renderer's Direct3D configuration code to make sure that the structures for your constant buffers match the cbuffer struct declarations in your HLSL, and that the component scalar types match across both declarations.
  • 렌더러의 c + + 코드에서 상수 버퍼 선언에 Directxmath 형식을 사용 하 여 적절 한 데이터 압축을 보장 합니다.In your renderer's C++ code, use DirectXMath types in your constant buffer declarations to ensure proper data packing.
  • 상수 버퍼를 효율적으로 사용 하는 가장 좋은 방법은 업데이트 빈도에 따라 셰이더 변수를 상수 버퍼로 구성 하는 것입니다.The best way to efficiently use constant buffers is to organize shader variables into constant buffers based on their frequency of update. 예를 들어 프레임당 한 번 업데이트 되는 균일 한 데이터와 카메라를 이동할 때만 업데이트 되는 기타 균일 한 데이터를 보유 하는 경우 해당 데이터를 별도의 두 상수 버퍼로 분리 하는 것이 좋습니다.For example, if you have some uniform data that is updated once per frame, and other uniform data that is updated only when the camera moves, consider separating that data into two separate constant buffers.
  • 사용자가 적용 하거나 잘못 적용 한 의미 체계가 가장 오래 된 셰이더 컴파일 (FXC.EXE) 오류의 원인이 됩니다.Semantics that you have forgotten to apply or which you have applied incorrectly will be your earliest source of shader compilation (FXC) errors. 두 번 확인 합니다.Double-check them! 이전 페이지와 샘플은 Direct3D 11 이전의 HLSL 의미 체계를 서로 다른 버전으로 참조 하기 때문에 문서는 약간 혼란 스 러 울 수 있습니다.The docs can be a bit confusing, as many older pages and samples refer to different versions of HLSL semantics prior to Direct3D 11.
  • 각 셰이더를 대상으로 하는 Direct3D 기능 수준을 확인 해야 합니다.Make sure you know which Direct3D feature level you are targeting for each shader. 기능 수준 9의 의미 체계는 _ * 11 1의 의미 체계와 다릅니다 _ .The semantics for feature level 9_* are different from those for 11_1.
  • SV _ 위치 의미 체계는 연결 된 보간 후 위치 데이터를 좌표 값으로 확인 합니다. 여기서 x는 0이 고 렌더링 대상 너비는 0이 고, y는 0과 렌더링 대상 높이 사이의 좌표 이며, z는 원래의 유형이 같은 좌표 w 값 (z/w)으로 나눈 후 w는 1을 원래 w 값 (1/w)으로 나눈 값입니다.The SV_POSITION semantic resolves the associated post-interpolation position data to coordinate values where x is between 0 and the render target width, y is between 0 and the render target height, z is divided by the original homogeneous coordinate w value (z/w), and w is 1 divided by the original w value (1/w).

방법: 간단한 OpenGL ES 2.0 렌더러를 Direct3D 11로 이식How to: port a simple OpenGL ES 2.0 renderer to Direct3D 11

셰이더 개체 이식Port the shader objects

꼭 짓 점 버퍼 및 데이터를 이식 합니다.Port the vertex buffers and data

화면에 그리기Draw to the screen