TECHARTNOMAD | TECHARTFLOWIO.COM

MAYA

MAYA VRAY GLSL PROGRAMMING PART-1

jplee 2023. 5. 14. 20:46
Custom material 을 제작하기 위해 Vray GLSL 을 사용하기 시작 하면서 알게 된 점들을 시리즈로 작성해 보기로 했습니다. 이 주제는 총 3개의 Parts 로 나뉘어 져 있습니다.

 

 

Abstract

마야(Maya)는 3D 그래픽 소프트웨어 중 하나이며, V-Ray는 렌더링 엔진 중 하나입니다. GLSL은 OpenGL Shading Language의 약자로, 3D 그래픽 애플리케이션에서 쉐이더 프로그래밍에 사용되는 언어입니다.

마야와 V-Ray를 함께 사용할 때 GLSL을 사용하면 더욱 다양하고 복잡한 쉐이더를 작성할 수 있습니다. GLSL을 사용하면 쉐이더를 직접 프로그래밍할 수 있으므로 사용자가 직접 쉐이딩 네트워크를 만들 수 있습니다. 이를 통해 사용자는 텍스처 매핑, 조명, 반사, 반사율, 반사도 및 투명도 등 다양한 효과를 만들어 낼 수 있습니다.

V-Ray는 쉐이더 작성을 위해 GLSL을 지원합니다. 이를 통해 사용자는 V-Ray 머티리얼에서 GLSL 쉐이더를 사용할 수 있으며, 사용자 정의 V-Ray 머티리얼을 작성할 수도 있습니다. 이를 통해 사용자는 V-Ray에서 지원하는 다양한 쉐이딩 기술을 사용하면서도, 더욱 복잡한 쉐이더를 만들어 내는 것이 가능합니다.

GLSL을 사용하면 V-Ray 머티리얼이나 쉐이딩 네트워크의 한계를 넘어서고, 더욱 고급스러운 쉐이더를 만들 수 있습니다. 하지만 GLSL 프로그래밍은 어렵고 복잡하기 때문에, 쉐이더 프로그래밍에 익숙하지 않은 사용자들은 학습에 시간을 투자해야 합니다.

GLSL 셰이더 프로그래밍 학습 방법.

GLSL 셰이더 프로그래밍을 학습하는 가장 좋은 방법은 다음과 같습니다.

1. 기본 개념 학습: 셰이더 프로그래밍을 학습하기 전에 GLSL 언어와 셰이더의 기본 개념을 이해해야 합니다. OpenGL 책이나 강좌를 통해 기본적인 개념을 학습할 수 있습니다.

2. 예제 코드 이해: GLSL 셰이더 예제 코드를 이해하는 것은 셰이더 프로그래밍을 학습하는데 중요합니다. 예제 코드를 사용하여 GLSL 언어와 셰이더를 이해하고, 셰이더의 입력과 출력 등을 파악하는 것이 좋습니다.

3. 직접 코딩: GLSL 셰이더 프로그래밍을 학습하려면 직접 코드를 작성해야 합니다. 초기에는 단순한 셰이더를 만들어보고, 점차적으로 복잡한 셰이더를 작성해보는 것이 좋습니다.

4. 셰이더 툴 사용: 셰이더 프로그래밍을 학습하는 동안 셰이더 툴을 사용하는 것이 도움이 됩니다. 예를 들어, ShaderToy와 같은 온라인 툴을 사용하여 다른 사용자가 작성한 셰이더를 학습하거나, 셰이더 개발에 유용한 기능을 제공하는 툴을 사용할 수 있습니다.

5. 개발 환경 설정: GLSL 셰이더 프로그래밍을 위한 개발 환경을 설정하는 것이 중요합니다. 대표적인 개발 환경으로는 Visual Studio Code, Eclipse, NetBeans 등이 있습니다.

6. 온라인 자료 이용: 온라인에는 GLSL 셰이더 프로그래밍에 대한 다양한 자료가 있습니다. 유튜브에서 GLSL 강좌나 ShaderToy와 같은 온라인 툴을 사용한 예제 코드를 찾아보거나, 온라인 포럼에서 다른 사용자들의 질문과 답변을 살펴볼 수도 있습니다.

7. 문서 읽기: GLSL 공식 문서나 책에서 GLSL 언어와 셰이더 프로그래밍에 대한 상세한 정보를 얻을 수 있습니다. 이를 통해 더욱 전문적인 지식을 얻을 수 있습니다.

위의 방법을 참고하여 GLSL 셰이더 프로그래밍을 학습하면, 셰이더를 이용한 다양한 그래픽 효과를 만들 수 있습니다.

 

Vray GLSL Overview

VRayMtlGLSL 및 VRayTexGLSL 노드는 GLSL 셰이더(.frag, .glsl 파일) 또는 V-Ray 사전 컴파일된 조각 셰이더(.pfrag 파일)를 로드하고 V-Ray로 직접 렌더링하는 데 사용할 수 있습니다. 셰이더 파일이 텍스처가 아닌 머티리얼을 설명하는 경우 VRayMtlGLSL 머티리얼을 사용하여 렌더링하거나 VRayLightMtl 머티리얼의 색상 슬롯에 VRayTexGLSL 맵을 할당하여 렌더링할 수 있습니다.

VRayGLSLMtl과 VRayTexGLSL은 모두 동일한 사용자 인터페이스를 공유한다는 점에 유의하세요.

VRayMtlGLSL 재질과 VRayTexGLSL 맵은 GLSL 지원의 V-Ray 구현의 첫 번째 단계의 일부입니다. 이 버전의 V-Ray에서 셰이더는 소프트웨어 가상 머신의 바이트 코드로 컴파일 된 다음 해석됩니다. 이 런타임 해석으로 인해 GLSL 셰이더는 C++로 작성된 V-Ray 셰이더보다 렌더링 속도가 다소 느릴 수 있습니다. 향후 V-Ray 빌드에서는 더 빠른 렌더링을 위해 셰이더가 기계 코드로 직접 컴파일됩니다.


Vray GLSL API

V-Ray GLSL API는 V-Ray 렌더링 엔진의 일부로, OpenGL/GLSL 기반의 그래픽 애플리케이션에서 V-Ray 렌더링 엔진을 사용할 수 있게 해주는 API입니다.

V-Ray GLSL API는 개발자가 OpenGL/GLSL 셰이더에서 V-Ray 렌더링 엔진의 기능을 사용할 수 있도록 하며, V-Ray의 고급 렌더링 기술을 그래픽 애플리케이션에 적용할 수 있습니다.

V-Ray GLSL API를 사용하면 다음과 같은 기능을 수행할 수 있습니다.

  1. 물리 기반 렌더링: V-Ray GLSL API를 사용하여 물리 기반 렌더링(PBR)을 수행할 수 있습니다. 이를 통해 더욱 현실적인 재질을 만들고, 더욱 자연스러운 조명 효과를 구현할 수 있습니다.
  2. 빠른 렌더링: V-Ray GLSL API는 V-Ray의 빠른 렌더링 속도를 그래픽 애플리케이션에서 사용할 수 있도록 합니다. 이를 통해 대규모 시나리오에서도 빠른 렌더링 속도를 유지할 수 있습니다.
  3. 높은 품질의 렌더링: V-Ray GLSL API는 V-Ray의 높은 품질의 렌더링 기능을 그래픽 애플리케이션에서 사용할 수 있도록 합니다. 이를 통해 더욱 섬세한 디테일을 구현하고, 더욱 정확한 렌더링 결과물을 얻을 수 있습니다.
  4. 렌더링 파라미터 제어: V-Ray GLSL API를 사용하여 V-Ray 렌더링 엔진의 다양한 파라미터를 제어할 수 있습니다. 이를 통해 더욱 정교한 렌더링 조절이 가능해지며, 더욱 다양한 렌더링 결과물을 얻을 수 있습니다.

V-Ray GLSL API를 사용하여 그래픽 애플리케이션에서 V-Ray의 고급 렌더링 기능을 사용할 수 있으며, 이를 통해 높은 품질의 그래픽 효과를 구현할 수 있습니다.


Vray GLSL Technical Specification

GLSL Support - V-Ray for 3ds Max - Chaos Help

Vray GLSL 은 Native GLSL 프로그래밍을 완벽하게 Wrapping 하고 있지 않습니다.

또한 Vray Renderer 의 GPU 가속 렌더링 디바이스와 호환되지 않는다는 단점도 있습니다.

추가 형식 한정자

__channel

이 형식 한정자는 전역 변수를 렌더링 채널로 표시하기 위해서만 사용할 수 있습니다. 렌더 채널은 V-Ray VFB에서 자동으로 생성되고 첨부됩니다. 지원되는 채널 유형에는 bool, int, float, vec2, vec3 등 여러 가지가 있습니다. 렌더 채널에 대한 쓰기는 channel 변수에 값을 할당하여 수행됩니다. 채널 변수에 대한 쓰기 이벤트가 두 개 이상 있는 경우 마지막으로 쓴 값만 고려됩니다. 이니셜라이저를 사용하여 기본 채널 값을 설정합니다.

 

#version 110
  
__channel vec2 UVSpace = vec2(0.314);
void main() {
  UVSpace = vec2(gl_TexCoord[0]);
  gl_FragColor = vec4(0.3, 0.8, 0.2, 1.0);
}

 

__persistent

이 형식 한정자를 사용하여 렌더링 채널을 영구적으로 만듭니다. 영구 렌더 채널은 셰이더 실행이 폐기 문에 도달 한 경우에도 값을 유지하고 V-Ray VFB에 씁니다.

#version 110
  
__persistent __channel vec2 UVSpace = vec2(0.314);
  
void main() {
  UVSpace = vec2(gl_TexCoord[0]);
  discard;
  gl_FragColor = vec4(0.3, 0.8, 0.2, 1.0);
}

 

__color

이 유형 한정자를 사용하여 vec3 또는 vec4 유형을 각각 RGB 또는 RGBA 색상으로 표시하여 3ds Max UI에서 색상 견본이 생성되어 이 매개변수를 조정할 수 있습니다.

#version 110
  
__color uniform vec3 input_color = vec3(1.0, 0.5, 0.25);
  
uniform float alpha = 1.0;
uniform float gamma = 1.0;
  
void main() {
  gl_FragColor = vec4(pow(input_color, vec3(1.0 / gamma)), alpha);
}

기본 제공 가변 변수

varying vec4 gl_TexCoord[16]; 
//텍스처 좌표입니다. 고정 크기 배열은 최대 16개의 텍스처 좌표 채널을 허용합니다.

varying vec3 vr_Position; //카메라 공간 좌표의 교차 표면 점입니다.

varying vec3 vr_Normal; //카메라 공간의 표면 교차점에 있는 매끄러운 표면 법선 단위 벡터입니다.

varying vec3 vr_TexTangent; 
//카메라 공간에서 텍스처 u 방향을 따라 가리키는 매끄러운 표면 탄젠트 단위 벡터입니다.

varying vec3 vr_TexBinormal; 
//카메라 공간에서 텍스처 v 방향을 가리키는 매끄러운 표면 쌍정규 단위 벡터입니다.

varying vec3 vr_Direction; //카메라 공간에서 광선을 따라 가리키는 단위 벡터입니다.

varying vec3 vr_Velocity; // MAYA 내에서 틱 1회에 대한 카메라 공간 내 표면 포인트의 속도입니다.

varying int vr_TotalRayDepth; 
//추적 중인 광선의 총 깊이입니다. 
//지금까지 광선 경로를 따라 추적된 모든 반사, 굴절 및 전역 조명 레벨의 합계입니다.

varying int vr_DiffuseRayDepth;
//추적 중인 광선의 확산 깊이입니다. 지금까지 광선 경로를 따라 추적된 전역 조명 레벨의 수만 고려됩니다.

varying int vr_NumSuperSamples;
//Number of samples that the parent hit point along the ray path is taking.

varying int vr_SuperSampleIndex; //이 교차점에 대한 현재 슈퍼샘플의 인덱스입니다.

varying int vr_RayFlags;
//현재 광선의 유형을 설명하는 광선 플래그입니다. 지원되는 플래그 목록은 내장 상수를 참조하세요.

varying vec3 vr_Origin;
//현재 카메라 공간 좌표에서 광선의 원점을 추적하고 있습니다.

varying vec3 vr_GeomNormal; 
//카메라 공간 좌표의 적중 프리미티브에 대한 실제 기하 법선 단위 벡터입니다.

varying vec3 vr_TextureDu[16];
//지정된 텍스처 공간의 u 방향에 대한 표면 파생 데이터의 배열입니다. 
//모든 도함수는 카메라 공간의 단위 벡터입니다.

varying vec3 vr_TextureDv[16];
//지정된 텍스처 공간의 v 방향에 대한 표면 파생 데이터의 배열입니다. 
//모든 도함수는 카메라 공간의 단위 벡터입니다.

내장 Uniform 변수

uniform int vr_NumLights;
//장면의 조명 수입니다.

uniform mat4 vr_CameraToWorld;
//카메라-세계 공간 변환 매트릭스.

uniform mat4 vr_WorldToCamera;
//월드-카메라 공간 변환 매트릭스.

uniform mat4 vr_CameraToObject;
//카메라-개체 공간 변환 매트릭스입니다.

uniform mat4 vr_ObjectToCamera;
//개체-카메라 공간 변환 매트릭스입니다.

uniform vr_FrameDataSettings vr_FrameData;
//프레임별 중요한 매개 변수를 보유하는 vr_FrameDataSettings 구조체의 기본 제공 인스턴스 입니다. 
//vr_FrameDataSettings 형식의 사용 가능한 모든 멤버에 대한 기본 제공 형식을 참조하세요. 
//항상 원본 vr_FrameData 참조하는 대신 이 인스턴스의 로컬 복사본을 보유하는 것이 가장 좋습니다.
참고: 변환 매트릭스를 사용할 때는 항상 변환할 벡터를 오른쪽에 배치합니다. 
참고: 변환할 vec3 벡터는 항상 vec4 변수로 래핑해야 하며, 여기서 w 좌표는 방향 vec0 벡터의 경우 0.3이고 좌표 vec1 점의 경우 0.3입니다. 
참고: vrayGLSL을 사용하면 사용자 정의 uniform 변수를 전역 범위에서 초기화할 수 있습니다. 이것은 셰이더에 기본 입력 값을 제공하는 매우 편리한 기술입니다.

기본 제공 상수

const int VR_TRACE_REFRACT;
//굴절을 추적하도록 vr_trace() 함수에 지시합니다. 
//vr_TraceOptions의 rayType 멤버에서 설정해야 합니다. 
//vr_TraceOptions의 정의에 대해서는 Built-in types 를 참조하세요.

const int VR_TRACE_REFLECT;
//vr_trace() 함수에 반사를 추적하도록 지시합니다. 
//vr_TraceOptions의 rayType 멤버에서 설정해야 합니다. 
//vr_TraceOptions의 정의에 대해서는 Built-in types를 참조하십시오.

const int VR_TRACE_TRANSPARENT;
//vr_trace() 함수가 표면에 부딪히지 않은 것처럼 광선을 따라 더 멀리 추적하도록 지시합니다. 
//vr_TraceOptions의 rayType 멤버에서 설정해야 합니다. 
//vr_TraceOptions의 정의에 대해서는 Built-in types를 참조하십시오.

const int VR_TRACE_ENVIRONMENT;
//광선의 경로에 있는 내용에 관계없이 현재 광선 방향을 사용하여 장면 환경을 샘플링하도록 vr_trace() 함수에 지시 합니다. 
//vr_TraceOptions의 rayType 멤버에서 설정해야 합니다. 
//vr_TraceOptions의 정의에 대해서는 Built-in types를 참조하십시오.

const int VR_REFLECT_FLAG;
//적어도 한 번의 반사를 통과한 광선을 표시하는 데 사용되는 플래그입니다.

const int VR_REFRACT_FLAG;
//적어도 한 번의 굴절을 통과한 광선을 표시하는 데 사용되는 플래그입니다.

const int VR_SHADOW_FLAG;
//그림자 광선을 표시하는 데 사용되는 플래그입니다.
const int VR_INDIRECT_FLAG;
//글로벌 일루미네이션 광선을 모으는 것을 표시하는 데 사용되는 플래그입니다.

const int VR_GLOSSY_FLAG;
//광택 반사 또는 굴절을 통과한 광선을 표시하는 데 사용되는 플래그입니다.

const int VR_ENVIRONMENT_FLAG;
//환경 기여도를 고려하여 음영 처리된 광선을 표시하는 데 사용되는 플래그입니다.

const int VR_SPECULAR_DISPERSAL;
//단일 스페큘러 광선을 추적하고 있음을 vr_trace() 함수에 알리는 데 사용되는 플래그입니다. 
//vr_TraceOptions의 rayGroup 멤버에서 설정해야 합니다. 
//vr_TraceOptions의 정의에 대해서는 Built-in types를 참조하십시오.

const int VR_GLOSSY_DISPERSAL;
//vr_trace() 함수에 여러 광택 광선을 추적하고 있음을 알리는 데 사용되는 플래그입니다. 
//vr_TraceOptions의 rayGroup 멤버에서 설정해야 합니다. 
//vr_TraceOptions의 정의에 대해서는 Built-in types를 참조하십시오.

const int VR_DIFFUSE_DISPERSAL;
//이 상수는 나중에 사용할 수 있도록 예약되어 있습니다.

 

기본 제공 형식

vr_LightIterator 구조는 장면의 특정 광원에 대한 중요한 음영 데이터를 보유합니다. 이 정보를 얻으려면 vr_LightIterator 인스턴스를 마지막 인수로 사용하여 vr_evalLight 호출합니다. 모든 멤버는 선택한 조명에 필요한 데이터로 설정됩니다.
struct vr_LightIterator 
{
    vec3 direction; // 카메라 좌표에서 광원을 가리키는 단위 벡터입니다.
    float dot_nl; // 표면 법선(범프일 수 있음)과 빛 방향의 도트 곱입니다.
    vec3 contribution; // 대기 효과와 거리 감쇠를 포함한 이 라이트의 직접 광원 기여도입니다.
};





struct vr_FrameDataSettings {
    int frameIndex; // Current frame index.
    float frameTime; // Time of the current frame in ticks.
    float frameStart; // Start of the frame in time. Usually frameStart <= frameTime <= frameEnd.
    float frameEnd; // End of the frame in time. Usually frameStart <= frameTime <= frameEnd.
    bool isOrthographic; // True if camera rays are parallel.
    float focalLength; // The camera's focal length.
    float aperture; // The camera's aperture.
    float aspectRatio; // The pixel aspect ratio.
    vec2 imagePlaneOffset; // The camera plane offset.
    float dofRadius; // The depth of field radius.
    float dofFocus; // The distance from the camera position to the focal plane.
    ivec2 imageResolution; // Width and height of the entire output image in pixels ignoring the render region.
    ivec4 regionMargin; // Render region margin in pixels.
};
참고: 조명에 여러 샘플 포인트가 있는 경우(즉, 영역 라이트인 경우) 방향에는 조명의 샘플 포인트 구름을 가리키는 평균 벡터가 포함됩니다.
vr_FrameDataSettings 구조는 현재 프레임에 대한 장면 설정을 보유하는 균일한 변수를 함께 압축합니다. 이 정보는 내장된 uniform variable vr_FrameData(vr_FrameDataSettings 인스턴스)를 통해 쉽게 액세스할 수 있습니다.

 

struct vr_DiffuseBRDFSettings {
    vec3 color; // The diffuse color for the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    vec3 normal; // The normal for which to calculate the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    float roughness; // Diffuse deviation in the [0.0, 1.0] range. Default value is 0.0.
    vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).
};

vr_DiffuseBRDFSettings 구조체에는 디퓨즈 BRDF의 파라미터가 저장됩니다. 이 구조는 vr_brdf_diffuse 내장 함수를 통해 연결할 디퓨즈 BRDF를 구성합니다. 자세한 내용은 내장 함수를 참조하세요.

 

 

struct vr_GlossyBRDFSettings {
    vec3 color; // The specular(reflection) color for the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    vec3 normal; // The normal for which to calculate the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    float highlightGlossiness; // Highlight glossiness of the BRDF in the [0.0, 1.0] range. Default value is 0.7.
    float reflectionGlossiness; // Reflection glossiness of the BRDF in the [0.0, 1.0] range. Default value is 0.7.
    int subdivs; // Amount of samples for the glossy reflection. Default value is 8.
    float anisotropy; // Anisotropy of the BRDF in the (-1.0, 1.0) range. Default value is 0.0.
    bool traceReflections; // Set if the BRDF should trace reflections. Default value is true.
    vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).
    float softenEdge; // Amount of softening the transition from dark to bright areas in specular reflections in the [-1.0, 1.0] range. Default value is 0.001.
    float anisoRotation; // Rotation of the BRDF anisotropy in degrees. Default value is 0.0.
};

vr_GlossyBRDFSettings 구조체에는 광택 BRDF 클래스, 즉 Phong, Blinn 및 Ward BRDF의 파라미터가 들어 있습니다. 이 구조체는 vr_brdf_phong, vr_brdf_blinn 또는 vr_brdf_ward 내장 함수를 통해 부착할 BRDF를 구성합니다. 자세한 내용은 내장 함수를 참조하세요.

 

 

struct vr_MirrorBRDFSettings {
    vec3 color; // Filter color of the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    vec3 normal; // The normal for which to calculate the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).
};

vr_MirrorBRDFSettings 구조체에는 미러 BRDF의 파라미터가 저장됩니다. 이 구조체는 vr_brdf_mirror 내장 함수를 통해 미러 BRDF를 연결하도록 구성합니다. 자세한 내용은 내장 함수를 참조하세요.

 

 

struct vr_GlassBRDFSettings {
    vec3 color; // Filter color of the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    vec3 normal; // The normal for which to calculate the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    float glossiness; // Glossiness of the BRDF in the [0.0, 1.0] range. Default value is 0.7.
    float ior; // Surface index of refraction for the BRDF. Default value is 1.5.
    int subdivs; // Amount of samples for the glossy reflections/refraction. Default value is 8.
    vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).
};

vr_GlassBRDFSettings 구조체에는 유리 BRDF의 파라미터가 저장됩니다. 이 구조는 vr_brdf_glass 내장 함수를 통해 부착할 유리 BRDF를 구성합니다. 자세한 내용은 내장 함수를 참조하세요.

 

 

 

struct vr_LightBRDFSettings {
    vec3 color; // Light color of the BRDF. Default value is vec3(1.0, 1.0, 1.0).
    vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).
    bool doubleSided; // Makes the BRDF double sided. Default value is false.
    bool emitOnBackSide; // Makes the BRDF emit light from its back side as well. If this is off, the material is rendered as black on the back sides. Default value is true.
};

vr_LightBRDFSettings 구조는 V-Ray 조명 BRDF의 매개 변수를 보유합니다. 이 구조는 vr_brdf_light 내장 함수를 통해 연결할 조명 BRDF를 구성합니다. 자세한 내용은 내장 함수를 참조하십시오.

 

 

struct vr_TraceOptions {
    int rayType; // One of the built-in constants VR_TRACE_REFLECT, VR_TRACE_REFRACT, VR_TRACE_TRANSPARENT or VR_TRACE_ENVIRONMENT. See Built-in constants. Default values is VR_TRACE_REFLECT.
    int rayGroup; // One of the VR_SPECULAR_DISPERSAL or VR_GLOSSY_DISPERSAL built-in constants. See Built-in constants. Default value is VR_SPECULAR_DISPERSAL.
    float ior; // Surface index of refraction at the current hit point. Ignored unless tracing a refracted ray. Default value is 1.44.
    vec3 ray; // User specified ray to be traced. Must be a unit vector in camera space. Default value is vec3(0.0, 0.0, 0.0).
    vec3 normal; // The surface normal (possibly bumped) according to which the reflections/refraction will be calculated. Must be a unit vector in camera space. Default value is vec3(0.0, 0.0, 0.0).
};

vr_TraceOptions 구조체에는 레이 트레이스에 필요한 모든 설정이 들어 있습니다. 트레이스가 성공적으로 수행되려면 잘 구성된 인스턴스를 vr_trace 함수에 파라미터로 전달해야 합니다. 자세한 내용은 vr_trace 내장 함수를 참조하세요.

 

 

struct vr_OcclusionOptions {
    float radius; // This parameters determines the amount of area (in units) where the ambient occlusion is calculated. Default value is 10.0.
    float distribution; // This parameter forces the sampling rays to gather closer to the surface normal. For evenly distributed samples use 0.0. For maximum surface normal concentrated sampling use 1.0. Allowed value range is [0.0, 1.0]. Default value is 0.0.
    float falloff; // This parameter controls the speed of the transition between occluded and unoccluded areas. Default value is 0.0.
    int subdivs; // This parameter holds the number of samples that V-Ray takes to calculate the occlusion effect. Lower values render faster but produce a more noisy result. Default value is 8.
};

vr_OcclusionOptions 구조체에는 vr_occlusion 내장 함수에 대한 설정이 저장됩니다. 오클루전 샘플링 프로세스를 미세 조정하는 데 사용할 수 있습니다. 자세한 내용은 내장 함수를 참조하세요.

참고: vr_DiffuseBRDFSettings, vr_GlossyBRDFSettings, vr_MirrorBRDFSettings, vr_GlassBRDFSettings, vr_LightBRDFSettings, vr_TraceOptions 또는 vr_OcclusionOptions 유형의 인스턴스를 만들 때 모든 멤버는 위의 지정된 값으로 초기화됩니다.

빌트인 함수

void vr_evalLight(int lightIndex, vec3 position, vec3 normal, out vr_LightIterator light);

인덱스 광원의 직접적인 조명 기여도를 평가합니다. 이 함수를 사용하여 셰이더의 직접 조명 조명을 평가할 수 있습니다.

lightIndex – 장면에 있는 광원의 인덱스로, [0, vr_NumLights) 범위에 있어야 합니다.

위치 – 카메라 공간의 표면 히트 포인트 좌표입니다.

normal – 카메라 공간의 표면 normal로, 단위 벡터여야 합니다.

lightIterator – 라이트 샘플링의 결과를 보유합니다. vr_LightIterator 참조하십시오.

 

vec4 vr_trace(vr_TraceOptions traceOptions);

광원 경로를 따르는 traceOptions 매개 변수에 따라 다음 광선을 추적합니다. 이 함수를 사용하여 현재 표면 히트 포인트에서 발생하는 다양한 광선을 추적하고 색상 결과를 얻을 수 있습니다. 이 기능에는 두 가지 모드가 있습니다. traceOptions.ray 멤버가 null이 아닌 벡터로 설정되면 추적됩니다. Else V-Ray는 traceOptions.normal에 따라 추적할 광선을 계산합니다. 두 경우 모두 traceOptions.rayType 및 traceOptions.rayGroup을 설정해야 합니다.

traceOptions – 위의 설명에 따라 vr_TraceOptions 인스턴스를 올바르게 설정합니다. 자세한 내용은 기본 제공 형식을 참조하세요.

반환 값 – 현재 표면 히트 포인트에서 지정된 광선 유형을 추적한 결과의 색상입니다.

참고: 최대 광선 깊이 제한에 도달하면 vr_trace 함수는 검은색을 반환합니다.

참고: 범프된 법선 광선에 의해 반사된 광선이 타격 표면 아래에 있으면 기하학적(평활화되지 않은) 법선을 사용하여 계산된 다른 광선으로 대체됩니다. 이로 인해 아티팩트가 발생할 수 있으므로(예: 광택 반사 효과에서) 샘플에 가중치를 부여하거나 일반적인 범핑 계수를 제한합니다.

참고: traceOptions.ior는 traceOptions.rayType이 VR_TRACE_REFRACT로 지정된 경우에만 고려됩니다. 굴절을 추적하고 ior 값이 설정되지 않은 경우 V-Ray는 기본값을 사용합니다.

 

 

vec3 vr_irradiance(vec3 normal, float importance);

이 기능을 사용하여 교차점에서 글로벌 조명을 획득할 수 있습니다.

Normal – 카메라 공간에서 표면 정상(부딪힐 수 있음) 단위 벡터입니다.

중요도 – 전역 조명 계산의 정밀도를 제어하는 데 사용됩니다. 범위는 [0,1]이어야 합니다.

반환 값 – GI 평가의 결과에 따른 rgb 색상입니다. 정규화 인수가 필요하지 않습니다.

 

 

vec3 vr_randomSample(int sampleIndex, int totalSamples)

DMC 샘플링에 적합한 [0,1) 범위의 랜덤 성분 값을 갖는 벡터를 검색합니다.

sampleIndex – 현재 샘플의 인덱스입니다. [0, totalSamples] 범위에 있어야 합니다.

totalSamples – 이 적중 지점에서 가져올 총 샘플 수입니다.

반환 값 – DMC 샘플링에 적합한 [3,0) 범위의 임의 성분 값을 갖는 vec1 벡터입니다.

 

 

vec3 vr_textureSize(sampler1D sampler);

이 함수를 사용하여 연결된 텍스처의 크기를 픽셀 단위로 가져옵니다.

sampler – 텍스처가 부착된 샘플러입니다.

반환 값 – X 구성 요소에서 샘플러에 연결된 텍스처의 너비를 유지하는 VEC3 또는 연결된 텍스처가 없는 경우 0.0입니다. 다른 모든 구성 요소는 0.0입니다.

vec3 vr_textureSize(sampler2D 샘플러);

이 함수를 사용하여 연결된 텍스처의 크기를 픽셀 단위로 가져옵니다.

sampler – 텍스처가 부착된 샘플러입니다.

반환 값 – X 및 Y 구성 요소에서 샘플러에 연결된 텍스처의 너비와 높이를 유지하는 VEC3 또는 연결된 텍스처가 없는 경우 0.0입니다. z 구성 요소는 0.0입니다.

 

 

float vr_occlusion(vr_OcclusionOptions options);

이 함수를 사용하여 현재 표면 적중점에서 앰비언트 오클루전의 양을 평가할 수 있습니다.

options – 샘플링 프로세스에 대한 구성 파라미터입니다. 자세한 내용은 기본 제공 형식을 참조하세요.

반환 값 – [0.0, 1.0] 범위의 부동 소수점 값입니다. 반환 값 0.0은 표면 주변 폐색이 없음을 의미하고, 1.0은 완전히 폐색된 표면 지점으로 해석됩니다.

 

 

vec4 textureCube(samplerCube sampler, vec3 sampleDir);

이 함수를 사용하여 큐브맵 텍스처 샘플링을 수행할 수 있습니다.

Sampler – 큐브맵 텍스처가 어태치되는 샘플러입니다. 텍스처는 +Y가 위를 가리키는 수평 십자 구성을 따라야 합니다.

sampleDir – 샘플링 방향입니다. 카메라 공간에서 정규화된 단위 벡터가 될 것으로 예상됩니다.

반환 값 – 샘플링 방향에 해당하는 색상입니다.


빌트인 BRDF 기능

GLSL 셰이더는 명시적 라이트 루프를 사용할 수 있지만 이러한 접근 방식에는 한계가 있습니다(영역 조명의 조명이 정확하지 않거나 느리다는 등). 이것이 V-Ray를 사용하여 유용한 음영 구성 요소 (확산, 광택 반사, 굴절 등)와 함께 미리 정의 된 여러 BRDF 호출을 사용할 수있는 이유입니다. BRDF 호출은 즉시 실행되지 않습니다. 대신 셰이더 실행 중에 셰이더 실행이 완료된 후 평가되는 결합된 BRDF로 수집됩니다. 그런 의미에서 GLSL 셰이더는 다양한 BRDF 호출을 설정하고 생성하는 데만 사용됩니다. BRDF 호출은 조작할 수 있는 결과를 반환하지 않는다는 점을 제외하면 Open Shading Language의 클로저와 다소 유사합니다.
void vr_brdf_diffuse(vr_DiffuseBRDFSettings brdfSettings);

이 함수를 사용하여 광원 평가(직접 및 간접)에 자동으로 사용되는 셰이더에 확산 BRDF를 할당합니다. 새 BRDF는 이전에 연결된 다른 BRDF 위에 계층화되지만 모든 결과는 동일하게 합산됩니다. 라이트 루프나 vr_irradiance 호출이 필요하지 않습니다. gl_FragColor에 대한 쓰기 는 결과의 알파 구성 요소를 확인하는 데만 필요합니다. gl_FragColor의 rgb 구성 요소는 무시됩니다.

brdfSettings – 확산 BRDF 설정을 보유합니다. 자세한 내용은 기본 제공 형식을 참조하세요.

 

void vr_brdf_phong(vr_GlossyBRDFSettings brdfSettings);

이 함수를 사용하여 광원 평가(직접 및 간접)에 자동으로 사용되는 셰이더에 Phong BRDF를 할당합니다. 새 BRDF는 이전에 연결된 다른 BRDF 위에 계층화되지만 모든 결과는 동일하게 합산됩니다. 라이트 루프나 vr_irradiance 호출이 필요하지 않습니다. gl_FragColor에 대한 쓰기 는 결과의 알파 구성 요소를 확인하는 데만 필요합니다. gl_FragColor의 rgb 구성 요소는 무시됩니다.

brdfSettings – Phong BRDF 설정을 보유합니다. 모든 이방성 멤버는 무시됩니다. 자세한 내용은 기본 제공 형식을 참조하세요.

 

 

void vr_brdf_blinn(vr_GlossyBRDFSettings brdfSettings);

이 함수를 사용하여 광원 평가(직접 및 간접)에 자동으로 사용되는 셰이더에 Blinn BRDF를 할당합니다. 새 BRDF는 이전에 연결된 다른 BRDF 위에 계층화되지만 모든 결과는 동일하게 합산됩니다. 라이트 루프나 vr_irradiance 호출이 필요하지 않습니다. gl_FragColor에 대한 쓰기 는 결과의 알파 구성 요소를 확인하는 데만 필요합니다. gl_FragColor의 rgb 구성 요소는 무시됩니다.

brdfSettings – Blinn BRDF 설정을 보유합니다. 자세한 내용은 기본 제공 형식을 참조하세요.

 

 

void vr_brdf_ward(vr_GlossyBRDFSettings brdfSettings);

이 함수를 사용하여 광원 평가(직접 및 간접)에 자동으로 사용되는 셰이더에 Ward BRDF를 할당합니다. 새 BRDF는 이전에 연결된 다른 BRDF 위에 계층화되지만 모든 결과는 동일하게 합산됩니다. 라이트 루프나 vr_irradiance 호출이 필요하지 않습니다. gl_FragColor에 대한 쓰기 는 결과의 알파 구성 요소를 확인하는 데만 필요합니다. gl_FragColor의 rgb 구성 요소는 무시됩니다.

brdfSettings – 와드 BRDF 설정을 보유합니다. 자세한 내용은 기본 제공 형식을 참조하세요.

 

 

void vr_brdf_glass(vr_GlassBRDFSettings brdfSettings);

이 함수를 사용하여 광원 평가(직접 및 간접)에 자동으로 사용될 셰이더에 유리 BRDF를 할당합니다. 새 BRDF는 이전에 연결된 다른 BRDF 위에 계층화되지만 모든 결과는 동일하게 합산됩니다. 라이트 루프나 vr_irradiance 호출이 필요하지 않습니다. gl_FragColor에 대한 쓰기 는 결과의 알파 구성 요소를 확인하는 데만 필요합니다. gl_FragColor의 rgb 구성 요소는 무시됩니다.

brdfSettings – 유리 BRDF 설정을 보유합니다. 자세한 내용은 기본 제공 형식을 참조하세요.

 

 

void vr_brdf_mirror(vr_MirrorBRDFSettings brdfSettings);

이 함수를 사용하여 광원 평가(직접 및 간접)에 자동으로 사용되는 셰이더에 미러 BRDF를 할당합니다. 새 BRDF는 이전에 연결된 다른 BRDF 위에 계층화되지만 모든 결과는 동일하게 합산됩니다. 라이트 루프 또는 vr_irradiance c all이 필요하지 않습니다. gl_FragColor에 대한 쓰기 는 결과의 알파 구성 요소를 확인하는 데만 필요합니다. gl_FragColor의 rgb 구성 요소는 무시됩니다.

brdfSettings – 미러 BRDF 설정을 보유합니다. 자세한 내용은 기본 제공 형식을 참조하세요.

 

 

void vr_brdf_light(vr_LightBRDFSettings brdfSettings);

이 함수를 사용하여 광원 평가(직접 및 간접)에 자동으로 사용되는 셰이더에 광원 BRDF를 할당합니다. 새 BRDF는 이전에 연결된 다른 BRDF 위에 계층화되지만 모든 결과는 동일하게 합산됩니다. 라이트 루프나 vr_irradiance 호출이 필요하지 않습니다. gl_FragColor에 대한 쓰기 는 결과의 알파 구성 요소를 확인하는 데만 필요합니다. gl_FragColor의 rgb 구성 요소는 무시됩니다.

brdfSettings – 라이트 BRDF 설정을 보유합니다. 자세한 내용은 기본 제공 형식을 참조하세요.


지원되지 않는 GLSL 기능

다음 GLSL 기능은 V-Ray GLSL 구현에서 지원되지 않습니다.

내장 다양한 변수:

float gl_FogFragCoord에서 값을 읽는 것은 지원되지 않습니다. 항상 0.0을 반환합니다.

vec4는 gl_Color 전면 프리미티브에 대해 흰색을 반환하고 그렇지 않으면 검정색을 반환합니다.

vec4는 gl_SecondaryColor 전면 프리미티브에 대해 흰색을 반환하고 그렇지 않으면 검정색을 반환합니다.

내장 uniform 변수:

 

다음 변환 매트릭스는 프래그먼트 셰이더에서 액세스할 수 있지만 기본값만 있습니다.

gl_ModelViewMatrix

gl_ProjectionMatrix

gl_ModelViewProjectionMatrix

gl_NormalMatrix

gl_ModelViewMatrixInverse

gl_ProjectionMatrixInverse

gl_ModelViewProjectionMatrixInverse

gl_ModelViewMatrixTranspose gl_ProjectionMatrixTranspose

gl_ModelViewProjectionMatrixTranspose gl_ModelViewMatrixInverseTranspose

gl_ProjectionMatrixInverseTranspose

gl_ModelViewProjectionMatrixInverseTranspose

gl_TextureMatrix

gl_TextureMatrixInverse

gl_TextureMatrixTranspose gl_TextureMatrixInverseTranspose

대신 프래그먼트 셰이더의 좌표 공간 변환은 vr_CameraToWorld, vr_WorldToCamera, vr_CameraToObject vr_ObjectToCamera 통해 수행됩니다. 텍스처 공간 변환의 경우 다음 코드를 사용할 수 있습니다.
vec3 tangent = vr_TexTangent;
vec3 binormal = vr_TexBinormal;
vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;
mat3 vr_TextureToCamera = mat3(tangent, binormal, normal);

다음 uniform 변수는 black/zero/default 값을 반환하므로 지원되지 않습니다.

gl_NormalScale

gl_Point

gl_FrontMaterial

gl_BackMaterial

gl_LightSource

gl_LightModel

gl_FrontLightModelProduct

gl_BackLightModelProduct

gl_FrontLightProduct gl_BackLightProduct

gl_TextureEnvColor

gl_EyePlaneS

gl_EyePlaneT

gl_EyePlaneR

gl_EyePlaneQ

gl_ObjectPlaneS gl_ObjectPlaneT

gl_ObjectPlaneR

gl_ObjectPlaneQ

gl_Fog

특수 출력 변수:

gl_FragDepth에 쓰기는 지원되지 않습니다. 변경 사항이 발생하지 않습니다.

gl_FragData에 쓰기는 지원되지 않습니다. gl_FragColor에 쓰거나 조각을 삭제하는 것은 필수이므로 gl_FragData 취소됩니다. BRDF가 vr_brdf 기본 제공 함수를 통해 셰이더에 연결된 경우 gl_FragColor의 rgb 구성 요소는 무시됩니다. 자세한 내용은 Built-in functions를 참조하십시오.

내장 기능:

텍스처 샘플링 함수 texture3D는 지원되지 않습니다.

모든 섀도우 기능이 지원되는 것은 아닙니다. V-Ray는 섀도잉을 처리합니다.

텍스처 샘플링 함수의 모든 "Proj" 및/또는 "Lod" 버전. 선택적 bias 매개 변수는 무시됩니다. V-Ray는 샘플링 중 텍스처 필터링 및 세부 수준을 처리합니다.


GPU 지원

GLSL 셰이더는 제한 내에서 V-Ray GPU에 의해 지원됩니다. 아래에서 GPU 지원에 대한 자세한 정보를 찾을 수 있습니다.
특징
GPU 지원
내장 변수
gl_NormalMatrix
항상 ID 매트릭스입니다.
gl_ModelViewMatrixTranspose
항상 ID 매트릭스입니다.
gl_TextureMatrix
항상 ID 매트릭스입니다.
gl_TextureMatrixInverse
항상 ID 매트릭스입니다.
gl_TextureMatrixInverseTranspose
항상 ID 매트릭스입니다.
gl_TextureMatrixTranspose
항상 ID 매트릭스입니다.
gl_ModelViewMatrixInverseTranspose
항상 ID 매트릭스입니다.
gl_FogFragCoord
항상 0입니다.
gl_TexCoord[]
모든 gl_TexCoord[] 요소가 동일하므로 여러 UVW 채널이 지원되지 않습니다. 1
내장 기능
dFdx(); dFdy()
항상 0을 반환합니다.
fwidth()를 사용합니다.
항상 0을 반환합니다.
GLSL에 대한 V-Ray 확장
vr_Velocity
항상 0입니다.
vr_NumSuperSamples
항상 1입니다.
vr_SuperSampleIndex
항상 1입니다.
vr_TextureDu[]
지원되지 않습니다.
vr_TextureDv[]
지원되지 않습니다.
vr_VertexData[]
지원되지 않습니다.
vr_FrameData
다음 항목만 지원됩니다.
vr_FrameData.focalLength
vr_FrameData.aperture vr_FrameData.dofFocus
vr_FrameData.dofRadius vr_FrameData.imageResolution
vr_FrameData.imagePlaneOffset
vr_trace()
지원되지 않습니다.
vr_evalLight()
지원되지 않습니다. 호출을 시도하면 출력 조명 반복자에 다음 상수가 할당됩니다.
light.dot_nl = -1.0 light.contribution = vec3(0.0, 0.0, 0.0)
light.direction = vec3(0.0, 0.0, 0.0)
vr_intersect()
지원되지 않습니다.
BRDF
다음 BRDF 호출만 지원됩니다 2:
vr_brdf_diffuse()
vr_brdf_glass()
vr_brdf_mirror()
vr_brdf_ggx()
키워드
다음 키워드는 무시됩니다.
__채널
__영구

 

파트1 정리.

GLSL Native 에서는 되는 것이 Vray GLSL 에서는 동작하지 않는 것들도 꽤 존재 합니다. 그런 부분에 대해서 일부 API 문서 내용을 발췌 하여 번역 해 봤습니다.

문서의 내용을 하나 하나 읽어내려가더라도 이것에 숙달 된 사람이 아니라면 무척 햇갈리는 내용들이 많습니다.

가볍게 쭉 스위시 하게 읽어 보시기만 하십시오.

이제 파트2 에서 실제로 라이트 모델을 구현 하면서 특성을 설명 할 것이기 때문입니다.

'MAYA' 카테고리의 다른 글

[IDE]PyCharm + MayaCharm + API AutoComplete  (0) 2023.11.09
MAYA VRAY GLSL PROGRAMMING PART-3  (0) 2023.05.16
MAYA VRAY GLSL PROGRAMMING PART-2  (0) 2023.05.15