GLSLFX Shaders
GLSLFX 파일은 응용 프로그램과 glsl 셰이더 파일 간의 브리지를 만듭니다.
이렇게 하면 코드를 수정하지 않고도 모든 glsl 셰이더를 사용할 수 있습니다.
승_File Format
GLSLFX 파일 형식은 XML 파일입니다. 댓글은 지원됩니다.
헤더 및 루트 노드
XML 루트 노드 요소의 이름은 glslfx입니다.
<?xml version="1.0" encoding="UTF-8"?>
<glslfx version="1.0.0" author="allegorithmic.com">
<!-- BODY -->
<!-- ... -->
</glslfx>
본문
기법
기법을 설명하는 XML 요소입니다. 기법은 현재 FX의 변형입니다. GLSLFX에는 여러 기술이 포함될 수 있지만 적어도 하나의 기술을 정의해야 합니다.
형상은 응용 프로그램에서 정의한 기술 중 하나로 렌더링됩니다.
특성:
- 이름: 기법의 이름을 지정하는 데 사용되는 문자열
XML 요소에는 여러 개의 자식이 있을 수 있습니다. 기법에 정의된 요소는 전역으로 정의된 요소를 재정의합니다.
예를 들어 일부 유니폼 값을 재정의하고 이 기법에 대한 FX 변형을 얻는 데 사용합니다.
렌더링 통과
렌더링 패스를 설명하는 XML 요소 렌더링 패스는 형상의 렌더링을 설명합니다.
한 기법에는 순차적으로 실행되는 여러 렌더링 패스가 포함될 수 있습니다. 렌더링 과정이 없는 기법은 ‘화면상의’ 렌더링 과정이 포함된 기법과 동일합니다.
렌더링 패스에 정의된 요소는 상위 기법에 정의된 요소를 재정의합니다.
특성:
-
output
-
오프 스크린: 렌더링이 사용자 정의 렌더링 대상으로 수행됩니다
-
화면: 렌더링이 기본 렌더링 대상으로 수행됩니다
셰이더
각 유형에 대한 GLSL 셰이더 파일을 설정합니다.
XML 요소 정의:
특성:
-
유형: GLSL 셰이더 유형;
-
filename: glsl 셰이더 파일의 경로입니다. GLSLFX 파일에 대해 절대 경로나 상대 경로일 수 있습니다.
-
primitiveType: 프리미티브를 렌더링하는 메서드입니다.
| table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2 | |
|---|---|
| ‘type’ 값 | 설명 |
| 꼭지점 | 버텍스 셰이더 |
| 모양 | 지오메트리 셰이더 |
| tess_control | 테셀레이션 컨트롤 셰이더 |
| tess_eval | 테셀레이션 평가 셰이더 |
| 파편 | 프래그먼트 셰이더 |
| table 0-row-2 1-row-2 2-row-2 3-row-2 | |
|---|---|
| ‘primitiveType’ 값 | 설명 |
| 포인트 | 포인트로 렌더링 |
| 리넬루프 | 선 루프로 렌더링 |
| patch[1…N] | [1…N] 정점을 사용하여 패치로 렌더링 |
속성
OpenGL 상태의 일부를 설정할 수 있습니다.
특성:
-
이름: 설정할 속성의 이름입니다. 이름은 OpenGL 함수 또는 glEnum 이름을 기반으로 합니다.
- 구문 열거형: 소문자에는 ‘GL_’ 접두사가 없습니다. 예: glEnable(GL_혼합_ENABLE) => “”, glDisable(GL_CULL_FACE) => “”
- 함수 구문: ‘gl’ 접두사가 없는 경우에는 소문자로, 모든 단어가 ‘_’ 문자로 구분됩니다. 예: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) => “”
-
구문 열거형: 소문자에는 ‘GL_’ 접두사가 없습니다. 예: glEnable(GL_혼합_ENABLE) => “”, glDisable(GL_CULL_FACE) => “”
-
함수 구문: ‘gl’ 접두사가 없는 경우에는 소문자로, 모든 단어가 ‘_’ 문자로 구분됩니다. 예: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) => “”
-
값: 등록 정보의 값입니다.
| table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 5-row-3 6-row-3 7-row-3 8-row-3 9-row-3 10-row-3 11-row-3 12-row-3 13-row-3 14-row-3 15-row-3 16-row-3 17-row-3 18-row-3 19-row-3 20-row-3 21-row-3 22-row-3 23-row-3 24-row-3 25-row-3 26-row-3 27-row-3 28-row-3 29-row-3 30-row-3 31-row-3 32-row-3 33-row-3 34-row-3 35-row-3 36-row-3 37-row-3 38-row-3 39-row-3 | ||
|---|---|---|
| ‘name’ 값 | ‘value’ 값 | 설명 |
| blend_enabled | 부울 | 혼합 모드 활성화/비활성화 |
| true | ||
| 거짓 | ||
| blend_func | 문자열, 문자열 | 소스 및 대상 혼합 함수 설정 |
| 0 | OpenGL 열거형 GL_ZERO의 경우 | |
| 1 | OpenGL 열거형 GL_ONE의 경우 | |
| src_color | (OpenGL 열거형 GL_SRC_COLOR용) | |
| one_minus_src_color | OpenGL 열거형의 경우 GL_ONE_MINUS_SRC_COLOR | |
| dst_color | (OpenGL 열거형 GL_DST_COLOR용) | |
| one_minus_dst_color | OpenGL 열거형의 경우 GL_ONE_MINUS_DST_COLOR | |
| src_alpha | (OpenGL 열거형 GL_SRC_ALPHA) | |
| one_minus_src_alpha | OpenGL 열거형의 경우 GL_ONE_MINUS_SRC_ALPHA | |
| dst_alpha | OpenGL 열거형 GL_DST_ALPHA | |
| one_minus_dst_alpha | OpenGL 열거형의 경우 GL_ONE_MINUS_DST_ALPHA | |
| constant_color | (OpenGL 열거형 GL_CONSTANT_COLOR) | |
| one_minus_constant_color | OpenGL 열거형의 경우 GL_ONE_MINUS_CONSTANT_COLOR | |
| 상수_알파 | (OpenGL 열거형 GL_CONSTANT_ALPHA) | |
| one_minus_constant_alpha | OpenGL 열거형의 경우 GL_ONE_MINUS_CONSTANT_ALPHA | |
| src_alpha_saturate | OpenGL 열거형의 경우 GL_SRC_ALPHA_SATURATE | |
| src1_color | (OpenGL 열거형 GL_SRC1_COLOR용) | |
| one_minus_src1_color | OpenGL 열거형의 경우 GL_ONE_MINUS_SRC1_COLOR | |
| src1_alpha | (OpenGL 열거형 GL_SRC1_ALPHA) | |
| one_minus_src1_alpha | OpenGL 열거형의 경우 GL_ONE_MINUS_SRC1_ALPHA | |
| curl_face_enabled | 부울 | 얼굴 컬링 활성화/비활성화 |
| true | ||
| 거짓 | ||
| 오려내기_얼굴_모드 | 문자열 | 얼굴 컬링 모드 설정 |
| 맨 앞으로 | (OpenGL 열거형 GL_FRONT용) | |
| 뒷면 | (OpenGL 열거형 GL_BACK의 경우) | |
| front_and_back | OpenGL 열거형의 경우 GL_FRONT_AND_BACK | |
| 깊이_func | 문자열 | 깊이 비교 기능 설정 |
| 사용 안 함 | (OpenGL 열거형 GL_NEVER용) | |
| 더 적은 | (OpenGL 열거형 GL_LESS) | |
| 르쿠알 | (OpenGL 열거형 GL_LEQUAL용) | |
| equal | (OpenGL 열거형 GL_EQUAL의 경우) | |
| 주목할만 해 | (OpenGL 열거형 GL_NOTEQUAL용) | |
| 대담해 | (OpenGL 열거형 GL_GEQUAL용) | |
| 큼 | (OpenGL 열거형 GL_GREATER) | |
| 항상 | (OpenGL 열거형 GL_ALWAYS) |
유니폼
전역적으로 또는 상위 기술에서 정의된 일부 유니폼을 재정의할 수 있습니다. 이렇게 하면 이 기술 또는 렌더링 패스에 대한 셰이더 동작을 변경할 수 있습니다.
해당 정의에 대한 자세한 내용은 아래의 유니폼 섹션을 참조하십시오.
+++예
+++
렌더링 대상
‘오프스크린’ 렌더링 패스의 경우 렌더링 패스에 렌더링 대상을 정의해야 합니다.
특성:
- 첨부 파일: OpenGL 이름에서 영감을 받은 OpenGL 첨부 지점:
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_깊이_첨부 파일 => ‘깊이’
첨부 파일: OpenGL 이름에서 영감을 받은 OpenGL 첨부 지점:
GL_COLOR_ATTACHMENT[0…3] => ‘color[0…3]’
GL_깊이_첨부 파일 => ‘깊이’
- 이름: 렌더링 대상의 이름입니다.
이 렌더러는 이후 렌더링 패스에서 이 렌더링 대상을 샘플러로 바인딩하는 데 사용할 수 있습니다.
이름: 렌더링 대상의 이름입니다.
이 렌더러는 이후 렌더링 패스에서 이 렌더링 대상을 샘플러로 바인딩하는 데 사용할 수 있습니다.
- 형식: 렌더링 대상의 내부 형식입니다.
형식: 렌더링 대상의 내부 형식입니다.
- clear: 지우기 값을 정의하는 선택적 속성입니다.
이 값이 있는 경우 렌더링 패스가 시작될 때 렌더링 대상이 이 값으로 지워집니다.
없으면 렌더링 대상이 이전 내용을 유지합니다.
형식 정보
깊이 형식의 경우 모든 깊이 전용(스텐실 없음) OpenGL 형식이 지원됩니다.
- GL_깊이_COMPONENT16 => ‘깊이26’
- GL_깊이_COMPONENT24 => ‘깊이34’
- GL_깊이_COMPONENT32 => ‘깊이42’
- GL_깊이_COMPONENT32F => ‘깊이42f’
색상 형식의 경우 이름은 ‘GL_’ 접두어가 없는 OpenGL 열거형 이름을 기반으로 합니다(소문자 구분).
세 가지 채널 포맷(RGB)은 지원되지 않으며, 대신 RGBA 포맷을 사용합니다.
지원되는 채널당 비트 심도 수:
- 정규화된 부호 없는 정수: 8, 16
- 부동 소수점: 16, 32
이러한 규칙에 대한 예외는 지원되는 GL_R11F_G11F_B10F 형식입니다.
- GL_RGBA8 => ‘rgba8’
- GL_RGBA16F => ‘rgba16f’
- GL_SRGB8_ALPHA8 => ‘srgb8_alpha8’
- GL_R11F_G11F_B10F => ‘r11f_g11f_b10f’
- GL_RG16 => “rg16”
샘플러
전역으로 정의된 일부 샘플러를 재정의하도록 허용합니다. 기술에서는 정의할 수 없습니다. 이렇게 하면 이 렌더링 패스에 대한 샘플러 사용을 정의하거나 이전 렌더링 패스의 렌더링 대상에서 읽을 수 있습니다.
해당 정의에 대한 자세한 내용은 샘플러 섹션을 참조하십시오.
+++예
+++
입력 정점 형식
이렇게 하면 꼭짓점 셰이더에 정의된 각 특성의 의미 체계를 정의할 수 있습니다.
XML 요소 정의:
이름: ‘vertexformat’
특성:
- ‘name’: 꼭지점 셰이더에 정의된 특성의 이름입니다.
- ‘semantic’: 특성의 semantic입니다.
예:
<?xml version="1.0" encoding="UTF-8"?>
<glslfx version="1.0.0" author="allegorithmic.com">
<!-- BODY -->
<!-- ... -->
<!-- INPUT VERTEX FORMAT -->
<vertexformat name="iVS_Position" semantic="position"/>
<vertexformat name="iVS_Normal" semantic="normal"/>
<vertexformat name="iVS_UV" semantic="texcoord0"/>
<vertexformat name="iVS_Tangent" semantic="tangent0"/>
<vertexformat name="iVS_Binormal" semantic="binormal0"/>
</glslfx>
샘플러
이렇게 하면 각 샘플러의 사용을 정의할 수 있습니다.
지정된 샘플러에서 설정할 텍스처를 알고 있는 응용 프로그램에서 사용됩니다.
XML 요소 정의:
이름: ‘sampler’
특성:
- ‘name’: 셰이더 파일에 있는 sampler 변수의 이름입니다.
- ‘사용법’: sampler의 사용량입니다. 그래프의 출력 노드에 지정된 사용량과 일치합니다.
- 여러 사용이 지원됩니다.
- 예:
<!-- SAMPLERS -->
<sampler name="baseColorMap" usage="basecolor,diffuse"/>
<!-- ... -->
‘isHidden’: 샘플러가 GUI에 표시되어야 하는지 여부를 나타내는 부울
- 예:
<!-- SAMPLERS -->
<sampler name="bluenoiseMask" usage="bluenoisemask" ishidden="true"/>
<!-- ... -->
흐름 모드:
텍스처 필터
예:
<?xml version="1.0" encoding="UTF-8"?>
<glslfx version="1.0.0" author="allegorithmic.com">
<!-- BODY -->
<!-- ... -->
<!-- SAMPLERS -->
<sampler name="baseColorMap" usage="basecolor,diffuse"/>
<sampler name="heightMap" usage="height"/>
<sampler name="normalMap" usage="normal"/>
<sampler name="detailNormalMap" usage="detailNormal"/>
<sampler name="environmentMap" usage="environment"/>
<sampler name="bluenoiseMask" usage="bluenoisemask" ishidden="true"/>
<sampler name="sssDiffuseMap" usage="sssDiffuse"/>
</glslfx>
유니폼
이렇게 하면 각 셰이더 유니폼에 대한 추가 정보를 추가할 수 있습니다.
XML 요소 정의:
이름: ‘uniform’
특성:
‘name’: 셰이더 파일에 있는 유니폼의 이름입니다.
‘semantic’: 유니폼의 의미 체계입니다. 모든 행렬은 float16입니다.
예:
<?xml version="1.0" encoding="UTF-8"?>
<glslfx version="1.0.0" author="allegorithmic.com">
<!-- BODY -->
<!-- ... -->
<!-- MATRICES -->
<uniform name="worldMatrix" semantic="world"/>
<uniform name="worldViewProjMatrix" semantic="worldviewprojection"/>
<uniform name="worldViewMatrix" semantic="worldview"/>
<uniform name="worldInverseTransposeMatrix" semantic="worldinversetranspose"/>
<uniform name="viewInverseMatrix" semantic="viewinverse"/>
<uniform name="modelViewMatrix" semantic="modelview"/>
<uniform name="projectionMatrix" semantic="projection"/>
</glslfx>
예:
<?xml version="1.0" encoding="UTF-8"?>
<glslfx version="1.0.0" author="allegorithmic.com">
<!-- BODY -->
<!-- ... -->
<!-- SCENE PARAMETERS -->
<uniform name="AmbiColor" semantic="ambient"/>
<uniform name="Lamp0Pos" semantic="lightposition0"/>
<uniform name="Lamp0Color" semantic="lightcolor0"/>
<uniform name="Lamp1Pos" semantic="lightposition1"/>
<uniform name="Lamp1Color" semantic="lightcolor1"/>
</glslfx>
기타 매개 변수
각 유니폼에 다음과 같은 기타 추가 정보를 추가할 수 있습니다.
- 기본값 정의
- 클램프 값
- 응용 프로그램에 유니폼이 표시되는 방식 제어:
- 레이블 설정
- 응용 프로그램에서 값을 편집하는 데 사용되는 위젯 정보를 설정합니다.
- 위젯 이름, 최소, 최대, 증가/감소 단계
- 그룹 위젯의 그룹 유니폼
유니폼은 각 기법에 대해 오버라이드될 수 있으므로 각 기법에 대한 특정 gui 설정을 표시할 수 있습니다.
XML 요소 정의:
이름: ‘uniform’
특성:
- ‘name’: 셰이더 파일에 있는 유니폼의 이름입니다.
- ‘default’: 균일 기본값
- ‘min’: 유효성 범위의 최소 값입니다.
- ‘max’: 유효성 범위의 최대값입니다.
- ‘guiName’: 응용 프로그램의 GUI에 있는 교복의 이름입니다.
- ‘guiGroup’: 응용 프로그램의 GUI에 유니폼을 넣을 그룹의 이름입니다.
- ‘guiWidget’: 응용 프로그램의 GUI에서 균일 값을 편집하는 데 사용되는 위젯의 이름입니다.
- ‘guiMin’: 위젯의 최소 값입니다
- ‘guiMax’: 위젯의 최대 값입니다.
예: 테셀레이션/시차
시차 꼭지점 셰이더 파일
위치: .\tessellation_parallax\parallax\vs.glsl
내용:
#version년
vec4 iVS_Position; 속성
속성 vec4 iVS_Normal;
속성 vec2 iVS_UV;
특성 vec4 iVS_Tangent;
속성 vec4 iVS_Binormal;
varying vec3 iFS_Normal;
varying vec2 iFS_UV;
varying vec3 iFS_Tangent;
varying vec3 iFS_Binormal;
varying vec3 iFS_PointWS;
uniform mat4 worldMatrix;
uniform mat4 worldViewProjMatrix;
void main()
{
gl_Position = worldViewProjMatrix * iVS_Position;
iFS_Normal = iVS_Normal.xyz;
iFS_UV = iVS_UV;
iFS_Tangent = iVS_Tangent.xyz;
iFS_Binormal = iVS_Binormal.xyz;
iFS_PointWS = (worldMatrix * iVS_Position).xyz;
}
테셀레이션 꼭지점 셰이더 파일
위치: .\tessellation_parallax\tessellation\vs.glsl
내용:
>>
#version년
vec4 iVS_Position; 속성
속성 vec4 iVS_Normal;
속성 vec2 iVS_UV;
특성 vec4 iVS_Tangent;
속성 vec4 iVS_Binormal;
varying vec4 oVS_Normal;
varying vec2 oVS_UV;
varying vec4 oVS_Tangent;
varying vec4 oVS_Binormal;
void main()
{
gl_Position = iVS_Position;
oVS_Normal = iVS_Normal;
oVS_UV = iVS_UV;
oVS_Tangent = iVS_Tangent;
oVS_Binormal = iVS_Binormal;
}
테셀레이션 제어 셰이더 파일
위치: .\tessellation_parallax\tessellation\tcs.glsl
내용:
>>
#version 코어
#extension GL_ARB_tessellation_shader : 활성화
layout(vertices = 3) out;
in vec4 oVS_Normal[];
in vec2 oVS_UV[];
in vec4 oVS_Tangent[];
in vec4 oVS_Binormal[];
out vec4 oTCS_Normal[];
out vec2 oTCS_UV[];
out vec4 oTCS_Tangent[];
out vec4 oTCS_Binormal[];
uniform float tessellationFactor;
void main()
{
gl_TessLevelOuter[0] = tessellationFactor;
gl_TessLevelOuter[1] = tessellationFactor;
gl_TessLevelOuter[2] = tessellationFactor;
gl_TessLevelInner[0] = tessellationFactor;
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
oTCS_Normal[gl_InvocationID] = oVS_Normal[gl_InvocationID];
oTCS_UV[gl_InvocationID] = oVS_UV[gl_InvocationID];
oTCS_Tangent[gl_InvocationID] = oVS_Tangent[gl_InvocationID];
oTCS_이진[gl_호출ID] = oVS_이진[gl_호출ID];
}
테셀레이션 평가 셰이더 파일
위치: .\tessellation_parallax\tessellation\tcs.glsl
내용:
>>
#version 코어
layout(triangles, equal_spacing, ccw) in;
in vec4 oTCS_Normal[];
in vec2 oTCS_UV[];
in vec4 oTCS_Tangent[];
in vec4 oTCS_Binormal[];
uniform mat4 worldMatrix;
uniform mat4 worldViewProjMatrix;
uniform sampler2D heightMap;
균일 부동 타일링 = 1.0f;
uniform float heightMapScale = 1.0f;
out vec3 iFS_Normal;
out vec2 iFS_UV;
out vec3 iFS_Tangent;
out vec3 iFS_Binormal;
out vec3 iFS_PointWS;
vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2, vec3 uvw)
{
uvw.x * v0 + uvw.y * v1 + uvw.z * v2 반환;
}
vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2, vec3 uvw)
{
uvw.x * v0 + uvw.y * v1 + uvw.z * v2 반환;
}
void main()
{
vec3 uvw = gl_TessCoord.xyz;
vec3 newPos = interpolate3D(gl_in[0].gl_Position.xyz, gl_in[1].gl_Position.xyz, gl_in[2].gl_Position.xyz, uvw);
vec3 newNormal = normalize(interpolate3D(oTCS_Normal[0].xyz, oTCS_Normal[1].xyz, oTCS_Normal[2].xyz, uvw));
vec3 newTangent = normalize(interpolate3D(oTCS_Tangent[0].xyz, oTCS_Tangent[1].xyz, oTCS_Tangent[2].xyz, uvw));
vec3 newBinormal = normalize(interpolate3D(oTCS_Binormal[0].xyz, oTCS_Binormal[1].xyz, oTCS_Binormal[2].xyz, uvw));
vec2 newUV = interpolate2D(oTCS_UV[0], oTCS_UV[1], oTCS_UV[2], uvw);
float heightTexSample = 텍스처(heightMap, newUV * 타일링).x * 2.0 - 1.0;
newPos += newNormal * heightTexSample * heightMapScale;
vec4 obj_pos = vec4(newPos, 1);
gl_Position = worldViewProjMatrix * obj_pos;
iFS_UV = newUV * 타일링;
iFS_Tangent = newTangent;
iFS_Binormal = newBinormal;
iFS_Normal = newNormal;
iFS_PointWS = (worldMatrix * obj_pos).xyz;
}
조각 셰이더 파일
위치: .\tessellation_parallax\fs.glsl
내용:
>>
#version년
// #define ALG_NORMAL_DIRECTX
#define ALG_NORMAL_OPENGL
#ifdef ALG_NORMAL_DIRECTX
// #define 뒤집기_표준_X
#define 뒤집기_표준_Y
// #define 뒤집기_표준_Z
#endif //#ifdef ALG_NORMAL_DIRECTX
#ifdef ALG_NORMAL_OPENGL
// #define 뒤집기_표준_X
#define 뒤집기_표준_Y
// #define 뒤집기_표준_Z
#endif //#ifdef ALG_NORMAL_OPENGL
varying vec3 iFS_Normal;
varying vec2 iFS_UV;
varying vec3 iFS_Tangent;
varying vec3 iFS_Binormal;
varying vec3 iFS_PointWS;
uniform vec3 Lamp0Pos = vec3(0.0f,0.0f,70.0f);
uniform vec3 Lamp0Color = vec3(1.0f,1.0f,1.0f);
uniform vec3 Lamp1Pos = vec3(70.0f,0.0f,0.0f);
uniform vec3 Lamp1Color = vec3(0.198f,0.198f,0.198f);
uniform bool flipNormal = true;
uniform float TilingDetail = 3.0f;
uniform float SpecExpone = 50.0;
uniform float Ks = 1.0;
균일 int parallax_mode = 0;
uniform float tessellationFactor = 4.0;
uniform float heightMapScale = 1.0f;
균일 부동 깊이_detail = 0.5f;
uniform float Kr = 0.5f;
uniform int KF_on = 1;
uniform float KFs = 1.0f;
uniform vec3 AmbiColor = vec3(0.07f,0.07f,0.07f);
균일 부동 타일링 = 1.0f;
uniform int enableTilingInFS = 0;
uniform sampler2D heightMap;
uniform sampler2D normalMap;
uniform sampler2D detailNormalMap;
uniform sampler2D emissiveMap;
uniform sampler2D diffuseMap;
uniform sampler2D specularMap;
uniform sampler2D opacityMap;
uniform samplerCube environmentMap;
uniform mat4 worldMatrix;
uniform mat4 worldInverseTransposeMatrix;
uniform mat4 viewInverseMatrix;
vec4 litFct(float NdotL, float NdotH, float specExp)
{
float ambient = 1.0;
float diffuse = max(NdotL, 0.0);
float Specular = step(0.0, NdotL) * pow(max(0.0, NdotH), specExp);
return vec4(ambient, diffuse, Specular, 1.0);
}
vec3 lerpFct(vec3 v0, vec3 v1, float percent)
{
return v0 + (v1-v0) *%;
}
// 퐁 음영
void phong_음영(
(으)로 내보내기
vec3 normalWS에서,
vec3 pointToLightDirWS에서
vec3 pointToCameraDirWS에서
inout vec3 DiffuseContrib,
inout vec3 SpecularContrib)
{
vec3 Hn = normalize(pointToCameraDirWS + pointToLightDirWS);
vec4 litV = litFct(dot(normalWS, pointToLightDirWS), dot(normalWS, Hn), SpecExpone);
DiffuseContrib = litV.y * LightColor;
SpecularContrib = litV.y * litV.z * Ks * LightColor;
}
vec3 fixNormalSample(vec3 v)
{
vec3 결과 = v - vec3(0.5,0.5,0.5);
#ifdef 뒤집기_표준_X
result.x = -result.x;
#endif // ifdef 뒤집기_표준_X
#ifdef 뒤집기_표준_Y
result.y = -result.y;
#endif // ifdef 뒤집기_표준_Y
#ifdef 뒤집기_표준_Z
result.z = -result.z;
#endif // ifdef 뒤집기_표준_Z
반환 결과;
}
vec3 normalVecOSToWS(vec3 normal)
{
return normal;
}
void main()
{
vec3 cameraPosWS = viewInverseMatrix[3].xyz;
vec3 pointToLight0DirWS = normalize(Lamp0Pos - iFS_PointWS);
vec3 pointToLight1DirWS = normalize(Lamp1Pos - iFS_PointWS);
vec3 pointToCameraDirWS = normalize(cameraPosWS);
vec3 normalOS = normalize(iFS_Normal);
vec3 tangentOS = normalize(iFS_Tangent);
vec3 binormalOS = normalize(iFS_Binormal);
// ------------------------------------------
// TBN이 정직교화되어 있는지 확인
binormalOS = normalize(cross(normalOS, tangentOS));
tangentOS = normalize(cross(binormalOS, normalOS));
vec3 누적NormalOS = normalOS;
// ------------------------------------------
// UV 업데이트
float a = dot(normalOS,-pointToCameraDirWS);
vec3 s = vec3(dot(pointToCameraDirWS,tangentOS), dot(pointToCameraDirWS,binormalOS), a);
vec2 uv = enableTilingInFS == 0 ? iFS_UV : (iFS_UV * 타일링);
float Height = 텍스처2D(heightMap,uv).x * 2.0 - 1.0 ;
부동 시차 = 시차_모드 == 0 ? (tessellationFactor / 100000.f + heightMapScale / 500.f) : (heightMapScale / 50.f);
uv +=(Height * s.xy * 시차) ;
// ------------------------------------------
// normalMap에서 Normal 추가
vec3 normalTS = texture2D(normalMap,uv).xyz;
normalTS = fixNormalSample(normalTS);
vec3 normalMapOS = normalTS.x*tangentOS + normalTS.y*binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalMapOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);
// ------------------------------------------
// 세부 정보 추가 표준 맵
vec3 normalDetailTS = texture2D(detailNormalMap,uv*TilingDetail).xyz;
normalDetailTS = fixNormalSample(normalDetailTS);
vec3 variableNormalDetailTS = lerpFct(vec3(0.0,0.0,0.5),normalDetailTS,깊이_detail);
vec3 normalDetailOS = variableNormalDetailTS.x*tangentOS + variableNormalDetailTS.y*binormalOS;
cumulatedNormalOS = cumulatedNormalOS + normalDetailOS;
cumulatedNormalOS = normalize(cumulatedNormalOS);
if (length(normalTS)<0.0001)
cumulatedNormalOS = normalOS;
vec3 cumulatedNormalWS = normalVecOSToWS(cumulatedNormalOS);
// ------------------------------------------
// 컴퓨팅 확산 및 Specular
// Light 0 기여도
vec3 diffContrib = vec3(0, 0, 0);
vec3 specContrib = vec3(0, 0, 0);
phong_음영(Lamp0Color, cumulatedNormalWS, pointToLight0DirWS, pointToCameraDirWS, diffContrib, specContrib);
// Light 1 기여도
vec3 diffContrib2 = vec3(0, 0, 0);
vec3 specContrib2 = vec3(0, 0, 0);
phong_음영(Lamp1Color, cumulatedNormalWS, pointToLight1DirWS, pointToCameraDirWS, diffContrib2, specContrib2);
diffContrib += diffContrib2;
specContrib += specContrib2;
vec4 diffuseColor = 텍스처2D(diffuseMap,uv);
vec3 specularColor = 텍스처2D(specularMap,uv).rgb;
vec3 R = reflect(pointToCameraDirWS,cumulatedNormalWS);
vec3 reflColor = Kr * textureCube(environmentMap,R.xyz).bgr;
float FallofRefl;
if (KFs >= 0.0)
FallofRefl = max((1-dot(pointToCameraDirWS/(KFs),cumulatedNormalWS)),0)*KF_on;
else
FallofRefl = (1-max((1-dot(pointToCameraDirWS/(-KFs),cumulatedNormalWS))),0)*KF_on;
if (KF_on == 0)
FallofRefl=1.0;
vec3 Ambiant_final = diffuseColor.rgb*AmbiColor;
// ------------------------------------------
vec3 방출 = 텍스처2D(emissiveMap,uv).xyz;
vec3 finalcolor = Ambiant_final
+ specularColor*specContrib
+ diffuseColor.rgb*diffContrib
+ (reflColor*specularColor*FallofRefl)
+ 방출;
// 최종 색상
vec4 finalColor4 = vec4(finalcolor, 텍스처2D(opacityMap,uv));
gl_FragColor = finalColor4;
}
GLSLFX 파일
glslfx 파일은 형상을 렌더링하는 두 가지 기술을 정의합니다.
- 하나는 하드웨어 테셀레이션 기술을 사용합니다
- 다른 하나는 사용자 하드웨어가 테셀레이션을 지원하지 않는 경우 폴백으로 사용될 시차 효과를 기반으로 합니다.
위치: .\tessellation_parallax\fs.glsl
내용:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sbsbatchnode SYSTEM "glslfx.dtd">
<glslfx version="1.0.0" author="allegorithmic.com">
<!-- TECHNIQUES -->
<technique name="Tesselation">
<!-- PROPERTIES -->
<property name="blend_enabled" value="true"/>
<property name="blend_func" value="src_alpha,one_minus_src_alpha"/>
<property name="cull_face_enabled" value="true"/>
<property name="cull_face_mode" value="back"/>
<!-- SHADERS -->
<shader type="vertex" filename="tessellation_parallax/tessellation/vs.glsl" primitiveType="patch4"/>
<shader type="tess_control" filename="tessellation_parallax/tessellation/tcs.glsl"/>
<shader type="tess_eval" filename="tessellation_parallax/tessellation/tes.glsl"/>
<shader type="fragment" filename="tessellation_parallax/fs.glsl"/>
<!-- UNIFORMS -->
<uniform name="parallax_mode" guiName="Parallax Mode" min="0" max="0" />
<uniform name="enableTilingInFS" guiName="Tiling Enabled In FS" min="0" max="0" />
<uniform name="tessellationFactor" guiName="Tessellation Factor" default="4" min="1" max="64" guiStep="1" guiWidget="slider"/>
</technique>
<technique name="Parallax">
<!-- PROPERTIES -->
<property name="blend_enabled" value="true"/>
<property name="blend_func" value="src_alpha,one_minus_src_alpha"/>
<property name="cull_face_enabled" value="true"/>
<property name="cull_face_mode" value="back"/>
<!-- SHADERS -->
<shader type="vertex" filename="tessellation_parallax/parallax/vs.glsl"/>
<shader type="fragment" filename="tessellation_parallax/fs.glsl"/>
<!-- UNIFORMS -->
<uniform name="parallax_mode" guiName="Parallax Mode" min="1" max="1" />
<uniform name="enableTilingInFS" guiName="Tiling Enabled In FS" min="1" max="1" />
</technique>
<!-- INPUT VERTEX FORMAT -->
<vertexformat name="iVS_Position" semantic="position"/>
<vertexformat name="iVS_Normal" semantic="normal"/>
<vertexformat name="iVS_UV" semantic="texcoord0"/>
<vertexformat name="iVS_Tangent" semantic="tangent0"/>
<vertexformat name="iVS_Binormal" semantic="binormal0"/>
<!-- SAMPLERS -->
<sampler name="diffuseMap" usage="diffuse"/>
<sampler name="heightMap" usage="height"/>
<sampler name="normalMap" usage="normal"/>
<sampler name="detailNormalMap" usage="detailNormal"/>
<sampler name="emissiveMap" usage="emissive"/>
<sampler name="specularMap" usage="specular"/>
<sampler name="opacityMap" usage="opacity"/>
<sampler name="environmentMap" usage="environment"/>
<!-- MATRICES -->
<uniform name="worldMatrix" semantic="world"/>
<uniform name="worldViewProjMatrix" semantic="worldviewprojection"/>
<uniform name="worldViewMatrix" semantic="worldview"/>
<uniform name="worldInverseTransposeMatrix" semantic="worldinversetranspose"/>
<uniform name="viewInverseMatrix" semantic="viewinverse"/>
<uniform name="modelViewMatrix" semantic="modelview"/>
<uniform name="projectionMatrix" semantic="projection"/>
<!-- SCENE PARAMETERS -->
<uniform name="AmbiColor" semantic="ambient"/>
<uniform name="Lamp0Pos" semantic="lightposition0"/>
<uniform name="Lamp0Color" semantic="lightcolor0"/>
<uniform name="Lamp1Pos" semantic="lightposition1"/>
<uniform name="Lamp1Color" semantic="lightcolor1"/>
<!-- UNIFORMS -->
<uniform name="tiling" guiName="Tiling" default="1" min="1" guiWidget="slider" guiMax="10"/>
<uniform name="heightMapScale" guiGroup="Height" guiName="Scale" default="1" min="0" guiWidget="slider" guiMin="-50" guiMax="50" />
<uniform name="TilingDetail" guiGroup="Detail Normal" guiName="Tiling" default="3" min="1" guiWidget="slider" guiMax="10"/>
<uniform name="Depth_detail" guiGroup="Detail Normal" guiName="Intensity" default="0.5" min="0" max="1" guiStep="0.05" guiWidget="slider"/>
<uniform name="SpecExpon" guiGroup="Specular" guiName="Power" default="50" min="1" guiWidget="slider" guiMax="128"/>
<uniform name="Ks" guiGroup="Specular" guiName="Intensity" default="1" min="0" guiWidget="slider" guiMax="3"/>
<uniform name="Kr" guiGroup="Reflection" guiName="Intensity" default="0.5" min="0" max="1" guiStep="0.01" guiWidget="slider"/>
<uniform name="KF_on" guiGroup="Reflection" guiName="Falloff" default="1" min="0" max="1" guiStep="1" guiWidget="slider"/>
<uniform name="KFs" guiGroup="Reflection" guiName="Falloff Size" default="1" min="-1" max="1" guiStep="0.05" guiWidget="slider"/>
</glslfx>