V-Ray for 3ds Max
GLSL Support
The V-Ray extensions for GLSL (vrayGLSL for short) add several functions and variables that can be used in GLSL shaders with the GLSL Map | VRayGLSLTex texture and the VRayGLSLMtl material. See the Examples section for some samples.
Last updated 23 April 2026
Overview
The V-Ray extensions for GLSL (vrayGLSL for short) add several functions and variables that can be used in GLSL shaders with the GLSL Map | VRayGLSLTex texture and the VRayGLSLMtl material. See the Examples section for some samples.

Additional Preprocessor Defines
__VRAY_GLSL__=110
__VRAY_HOST__=300
Additional Type Qualifiers
__channel
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line">__channel vec2 UVSpace = vec2(0.314);</span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> UVSpace = vec2(gl_TexCoord[0]);</span><span data-v-c2b1f83f="" class="line"> gl_FragColor = vec4(0.3, 0.8, 0.2, 1.0);</span><span data-v-c2b1f83f="" class="line">}</span></code>
__persistent
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line">__persistent __channel vec2 UVSpace = vec2(0.314);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> UVSpace = vec2(gl_TexCoord[0]);</span><span data-v-c2b1f83f="" class="line"> discard;</span><span data-v-c2b1f83f="" class="line"> gl_FragColor = vec4(0.3, 0.8, 0.2, 1.0);</span><span data-v-c2b1f83f="" class="line">}</span></code>
__color
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line">__color uniform vec3 input_color = vec3(1.0, 0.5, 0.25);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line">uniform float alpha = 1.0;</span><span data-v-c2b1f83f="" class="line">uniform float gamma = 1.0;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> gl_FragColor = vec4(pow(input_color, vec3(1.0 / gamma)), alpha);</span><span data-v-c2b1f83f="" class="line">}</span></code>
Built-In Varying Variables
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec4 gl_TexCoord[16];</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_Position;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_Normal;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_TexTangent;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_TexBinormal;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_Direction;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_Velocity;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying int vr_TotalRayDepth;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying int vr_DiffuseRayDepth;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying int vr_NumSuperSamples;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying int vr_SuperSampleIndex;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying int vr_RayFlags;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_Origin;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_GeomNormal;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_TextureDu[16];</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">varying vec3 vr_TextureDv[16];</span></code>
Built-In Uniform Variables
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">uniform int vr_NumLights;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">uniform mat4 vr_CameraToWorld;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">uniform mat4 vr_WorldToCamera;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">uniform mat4 vr_CameraToObject;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">uniform mat4 vr_ObjectToCamera;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">uniform vr_FrameDataSettings vr_FrameData;</span></code>
Built-In Constants
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_TRACE_REFRACT;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_TRACE_REFLECT;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_TRACE_TRANSPARENT;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_TRACE_ENVIRONMENT;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_REFLECT_FLAG;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_REFRACT_FLAG;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_SHADOW_FLAG;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_INDIRECT_FLAG;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_GLOSSY_FLAG;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_ENVIRONMENT_FLAG;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_SPECULAR_DISPERSAL;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_GLOSSY_DISPERSAL;</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">const int VR_DIFFUSE_DISPERSAL;</span></code>
Built-In Types
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_LightIterator {</span><span data-v-c2b1f83f="" class="line"> vec3 direction; // unit vector pointing towards the light source in camera coordinates.</span><span data-v-c2b1f83f="" class="line"> float dot_nl; // dot product of the surface normal (possibly bumped) and the light direction.</span><span data-v-c2b1f83f="" class="line"> vec3 contribution; // the direct light contribution from this light including atmospheric effects and distance falloff.</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_FrameDataSettings {</span><span data-v-c2b1f83f="" class="line"> int frameIndex; // Current frame index.</span><span data-v-c2b1f83f="" class="line"> float frameTime; // Time of the current frame in ticks.</span><span data-v-c2b1f83f="" class="line"> float frameStart; // Start of the frame in time. Usually frameStart <= frameTime <= frameEnd.</span><span data-v-c2b1f83f="" class="line"> float frameEnd; // End of the frame in time. Usually frameStart <= frameTime <= frameEnd.</span><span data-v-c2b1f83f="" class="line"> bool isOrthographic; // True if camera rays are parallel.</span><span data-v-c2b1f83f="" class="line"> float focalLength; // The camera's focal length.</span><span data-v-c2b1f83f="" class="line"> float aperture; // The camera's aperture.</span><span data-v-c2b1f83f="" class="line"> float aspectRatio; // The pixel aspect ratio.</span><span data-v-c2b1f83f="" class="line"> vec2 imagePlaneOffset; // The camera plane offset.</span><span data-v-c2b1f83f="" class="line"> float dofRadius; // The depth of field radius.</span><span data-v-c2b1f83f="" class="line"> float dofFocus; // The distance from the camera position to the focal plane.</span><span data-v-c2b1f83f="" class="line"> ivec2 imageResolution; // Width and height of the entire output image in pixels ignoring the render region.</span><span data-v-c2b1f83f="" class="line"> ivec4 regionMargin; // Render region margin in pixels.</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_Color {</span><span data-v-c2b1f83f="" class="line"> float r; // Red color component.</span><span data-v-c2b1f83f="" class="line"> float g; // Green color component.</span><span data-v-c2b1f83f="" class="line"> float b; // Blue color component.</span><span data-v-c2b1f83f="" class="line"> float a; // Alpha color component.</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">uniform vr_Color diffuse_color = vr_Color(0.9, 0.2, 0.8, 1.0);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_DiffuseBRDFSettings {</span><span data-v-c2b1f83f="" class="line"> vec3 color; // The diffuse color for the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> vec3 normal; // The normal for which to calculate the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> float roughness; // Diffuse deviation in the [0.0, 1.0] range. Default value is 0.0.</span><span data-v-c2b1f83f="" class="line"> vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_GlossyBRDFSettings {</span><span data-v-c2b1f83f="" class="line"> vec3 color; // The specular(reflection) color for the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> vec3 normal; // The normal for which to calculate the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> float highlightGlossiness; // Highlight glossiness of the BRDF in the [0.0, 1.0] range. Default value is 0.7.</span><span data-v-c2b1f83f="" class="line"> float reflectionGlossiness; // Reflection glossiness of the BRDF in the [0.0, 1.0] range. Default value is 0.7.</span><span data-v-c2b1f83f="" class="line"> int subdivs; // Amount of samples for the glossy reflection. Default value is 8.</span><span data-v-c2b1f83f="" class="line"> float anisotropy; // Anisotropy of the BRDF in the (-1.0, 1.0) range. Default value is 0.0.</span><span data-v-c2b1f83f="" class="line"> bool traceReflections; // Set if the BRDF should trace reflections. Default value is true.</span><span data-v-c2b1f83f="" class="line"> vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).</span><span data-v-c2b1f83f="" class="line"> 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.</span><span data-v-c2b1f83f="" class="line"> float anisoRotation; // Rotation of the BRDF anisotropy in degrees. Default value is 0.0.</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_MirrorBRDFSettings {</span><span data-v-c2b1f83f="" class="line"> vec3 color; // Filter color of the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> vec3 normal; // The normal for which to calculate the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_GlassBRDFSettings {</span><span data-v-c2b1f83f="" class="line"> vec3 color; // Filter color of the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> vec3 normal; // The normal for which to calculate the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> float glossiness; // Glossiness of the BRDF in the [0.0, 1.0] range. Default value is 0.7.</span><span data-v-c2b1f83f="" class="line"> float ior; // Surface index of refraction for the BRDF. Default value is 1.5.</span><span data-v-c2b1f83f="" class="line"> int subdivs; // Amount of samples for the glossy reflections/refraction. Default value is 8.</span><span data-v-c2b1f83f="" class="line"> vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_LightBRDFSettings {</span><span data-v-c2b1f83f="" class="line"> vec3 color; // Light color of the BRDF. Default value is vec3(1.0, 1.0, 1.0).</span><span data-v-c2b1f83f="" class="line"> vec3 transparency; // The transparency of the BRDF. Default value is vec3(0.0, 0.0, 0.0).</span><span data-v-c2b1f83f="" class="line"> bool doubleSided; // Makes the BRDF double sided. Default value is false.</span><span data-v-c2b1f83f="" class="line"> 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.</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_TraceOptions {</span><span data-v-c2b1f83f="" class="line"> 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.</span><span data-v-c2b1f83f="" class="line"> 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.</span><span data-v-c2b1f83f="" class="line"> float ior; // Surface index of refraction at the current hit point. Ignored unless tracing a refracted ray. Default value is 1.44.</span><span data-v-c2b1f83f="" class="line"> 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).</span><span data-v-c2b1f83f="" class="line"> 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).</span><span data-v-c2b1f83f="" class="line">};</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">struct vr_OcclusionOptions {</span><span data-v-c2b1f83f="" class="line"> float radius; // This parameters determines the amount of area (in units) where the ambient occlusion is calculated. Default value is 10.0.</span><span data-v-c2b1f83f="" class="line"> 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.</span><span data-v-c2b1f83f="" class="line"> float falloff; // This parameter controls the speed of the transition between occluded and unoccluded areas. Default value is 0.0.</span><span data-v-c2b1f83f="" class="line"> 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.</span><span data-v-c2b1f83f="" class="line">};</span></code>
Built-In Functions
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void vr_evalLight(int lightIndex, vec3 position, vec3 normal, out vr_LightIterator light);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">vec4 vr_trace(vr_TraceOptions traceOptions);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">vec3 vr_irradiance(vec3 normal, float importance);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">vec3 vr_randomSample(int sampleIndex, int totalSamples)</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">vec3 vr_textureSize(sampler1D sampler);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">float vr_occlusion(vr_OcclusionOptions options);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">vec4 textureCube(samplerCube sampler, vec3 sampleDir);</span></code>
Built-in BRDF functions
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void vr_brdf_diffuse(vr_DiffuseBRDFSettings brdfSettings);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void vr_brdf_phong(vr_GlossyBRDFSettings brdfSettings);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void vr_brdf_blinn(vr_GlossyBRDFSettings brdfSettings);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void vr_brdf_ward(vr_GlossyBRDFSettings brdfSettings);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void vr_brdf_glass(vr_GlassBRDFSettings brdfSettings);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void vr_brdf_mirror(vr_MirrorBRDFSettings brdfSettings);</span></code>
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void vr_brdf_light(vr_LightBRDFSettings brdfSettings);</span></code>
Unsupported GLSL Features
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">vec3 tangent = vr_TexTangent;</span><span data-v-c2b1f83f="" class="line">vec3 binormal = vr_TexBinormal;</span><span data-v-c2b1f83f="" class="line">vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line">mat3 vr_TextureToCamera = mat3(tangent, binormal, normal);</span></code>
GPU Support
Feature | GPU Support |
|---|
Feature | GPU Support |
|---|---|
Built-in variables | |
gl_NormalMatrix | Always identity matrix. |
gl_ModelViewMatrixTranspose | Always identity matrix. |
gl_TextureMatrix | Always identity matrix. |
gl_TextureMatrixInverse | Always identity matrix. |
gl_TextureMatrixInverseTranspose | Always identity matrix. |
gl_TextureMatrixTranspose | Always identity matrix. |
gl_ModelViewMatrixInverseTranspose | Always identity matrix. |
gl_FogFragCoord | Always is a zero. |
gl_TexCoord[] | All gl_TexCoord[] elements are identical, i.e. multiple UVW channels are not supported. 1 |
Built-in functions | |
dFdx(); dFdy() | Always return zero. |
fwidth() | Always returns zero. |
V-Ray extensions to GLSL | |
vr_Velocity | Always is a zero. |
vr_NumSuperSamples | Always is 1. |
vr_SuperSampleIndex | Always is 1. |
vr_TextureDu[] | Not supported. |
vr_TextureDv[] | Not supported. |
vr_VertexData[] | Not supported. |
vr_FrameData | Only the following are supported: vr_FrameData.focalLength |
vr_trace() | Not supported. |
vr_evalLight() | Not supported. If attempted to call it will assign the following constants to the output light iterator: light.dot_nl = -1.0 |
vr_intersect() | Not supported. |
BRDF | Only the following BRDF calls are supported 2: vr_brdf_diffuse() |
Keywords | The following keywords are ignored: __channel __persistent |
Examples
Example: Cool Metallic

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">__color uniform vec4 front_color = vec4(1.0, 1.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line">__color uniform vec4 background_color = vec4(1.0, 0.0, 1.0, 1.0);</span><span data-v-c2b1f83f="" class="line">uniform float amount = 0.8;</span><span data-v-c2b1f83f="" class="line">uniform float diffuse_scalar = 0.7;</span><span data-v-c2b1f83f="" class="line">uniform float specular_scalar = 0.06;</span><span data-v-c2b1f83f="" class="line">uniform float specular_shininess = 200.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">float phong_specular(vec3 light_dir, vec3 view_dir, vec3 normal, float specular_shininess) {</span><span data-v-c2b1f83f="" class="line"> vec3 reflection = reflect(view_dir, normal);</span><span data-v-c2b1f83f="" class="line"> float cos_rl = clamp(dot(reflection, light_dir), 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> return (pow(cos_rl, specular_shininess) * (specular_shininess + 2.0));</span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"> vec3 position = vr_Position;</span><span data-v-c2b1f83f="" class="line"> vec3 direction = vr_Direction;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> float dot_dn = clamp(-dot(direction, normal), 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> float mix_value = 1.0 - pow(dot_dn, 1.0 / amount);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec4 diffuse_color = mix(front_color, background_color, mix_value);</span><span data-v-c2b1f83f="" class="line"> vec4 specular_color = vec4(1.0, 1.0, 1.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec4 diffuse = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 specular = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec4 raw_diffuse = vec4(vec3(diffuse_color) * diffuse_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 raw_specular = vec4(vec3(specular_color) * specular_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 temp = raw_diffuse + raw_specular;</span><span data-v-c2b1f83f="" class="line"> float max_color_comp = max(max(temp.r,temp.g),temp.b);</span><span data-v-c2b1f83f="" class="line"> if (max_color_comp > 1.0) {</span><span data-v-c2b1f83f="" class="line"> raw_diffuse.rgb /= max_color_comp;</span><span data-v-c2b1f83f="" class="line"> raw_specular.rgb /= max_color_comp;</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vr_LightIterator light;</span><span data-v-c2b1f83f="" class="line"> for (int i = 0; i < vr_NumLights; ++i) {</span><span data-v-c2b1f83f="" class="line"> vr_evalLight(i, position, normal, light);</span><span data-v-c2b1f83f="" class="line"> float cos_nl = clamp(light.dot_nl, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> if (cos_nl > 0.0) {</span><span data-v-c2b1f83f="" class="line"> diffuse += vec4(vec3(cos_nl) * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> float specular_coeff = phong_specular(light.direction, direction, normal, specular_shininess);</span><span data-v-c2b1f83f="" class="line"> specular += vec4(vec3(specular_coeff * cos_nl) * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> diffuse *= raw_diffuse;</span><span data-v-c2b1f83f="" class="line"> specular *= raw_specular;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec3 gi_contribution = vr_irradiance(normal, 1.0);</span><span data-v-c2b1f83f="" class="line"> diffuse += vec4(raw_diffuse.rgb * gi_contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> gl_FragColor = diffuse + specular;</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Generator Stripe

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">__color uniform vec4 strip_color = vec4(1.0, 0.5, 1.0, 1.0);</span><span data-v-c2b1f83f="" class="line">__color uniform vec4 background_color = vec4(1.0, 1.0, 0.2, 1.0);</span><span data-v-c2b1f83f="" class="line">uniform float width = 0.5;</span><span data-v-c2b1f83f="" class="line">uniform float fuzz = 0.5;</span><span data-v-c2b1f83f="" class="line">uniform float scale = 5.0;</span><span data-v-c2b1f83f="" class="line">uniform float diffuse_scalar = 0.7;</span><span data-v-c2b1f83f="" class="line">uniform float specular_scalar = 0.06;</span><span data-v-c2b1f83f="" class="line">uniform float specular_shininess = 10.0;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line">float phong_specular(vec3 light_dir, vec3 view_dir, vec3 normal, float specular_shininess) {</span><span data-v-c2b1f83f="" class="line"> vec3 reflection = reflect(view_dir, normal);</span><span data-v-c2b1f83f="" class="line"> float cos_rl = clamp(dot(reflection, light_dir), 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> return (pow(cos_rl, specular_shininess) * (specular_shininess + 2.0));</span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"> vec3 position = vr_Position;</span><span data-v-c2b1f83f="" class="line"> vec3 direction = vr_Direction;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> float scaled_coord_t = fract(gl_TexCoord[0].t * scale);</span><span data-v-c2b1f83f="" class="line"> float fract1 = clamp(scaled_coord_t / fuzz, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> float fract2 = clamp((scaled_coord_t - width) / fuzz, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> fract1 *= (1.0 - fract2);</span><span data-v-c2b1f83f="" class="line"> fract1 = smoothstep(0.0, 1.0, fract1);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec4 diffuse_color = mix(strip_color, background_color, fract1);</span><span data-v-c2b1f83f="" class="line"> vec4 specular_color = vec4(1.0, 1.0, 1.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec4 diffuse = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 specular = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 raw_diffuse = vec4(vec3(diffuse_color) * diffuse_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 raw_specular = vec4(vec3(specular_color) * specular_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 temp = raw_diffuse + raw_specular;</span><span data-v-c2b1f83f="" class="line"> float max_color_comp = max(max(temp.r,temp.g),temp.b);</span><span data-v-c2b1f83f="" class="line"> if (max_color_comp > 1.0) {</span><span data-v-c2b1f83f="" class="line"> raw_diffuse.rgb /= max_color_comp;</span><span data-v-c2b1f83f="" class="line"> raw_specular.rgb /= max_color_comp;</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vr_LightIterator light;</span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < vr_NumLights; ++i) {</span><span data-v-c2b1f83f="" class="line"> vr_evalLight(i, position, normal, light);</span><span data-v-c2b1f83f="" class="line"> float cos_nl = clamp(light.dot_nl, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> if (cos_nl > 0.0) {</span><span data-v-c2b1f83f="" class="line"> diffuse += vec4(vec3(cos_nl) * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> float specular_coeff = phong_specular(light.direction, direction, normal, specular_shininess);</span><span data-v-c2b1f83f="" class="line"> specular += vec4(vec3(specular_coeff * cos_nl) * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> diffuse *= raw_diffuse;</span><span data-v-c2b1f83f="" class="line"> specular *= raw_specular;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec3 gi_contribution = vr_irradiance(normal, 1.0);</span><span data-v-c2b1f83f="" class="line"> diffuse += vec4(raw_diffuse.rgb * gi_contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> gl_FragColor = diffuse + specular;</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Glossy Glass

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">const int requiredSamples = 8;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">uniform float refraction_ior = 1.44;</span><span data-v-c2b1f83f="" class="line">uniform float amount = 0.1;</span><span data-v-c2b1f83f="" class="line">uniform float blend = 1.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"> vec3 direction = vr_Direction;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vr_TraceOptions options;</span><span data-v-c2b1f83f="" class="line"> options.rayGroup = VR_SPECULAR_DISPERSAL;</span><span data-v-c2b1f83f="" class="line"> options.ior = refraction_ior;</span><span data-v-c2b1f83f="" class="line"> options.normal = normal;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if((vr_RayFlags & VR_INDIRECT_FLAG) != 0) {</span><span data-v-c2b1f83f="" class="line"> options.rayType = VR_TRACE_REFLECT;</span><span data-v-c2b1f83f="" class="line"> vec4 reflection = vr_trace(options);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> options.rayType = VR_TRACE_REFRACT;</span><span data-v-c2b1f83f="" class="line"> vec4 refraction = vr_trace(options);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> float cos_dn = clamp(-dot(direction, normal), 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> float lerpFactor = (1.0 - pow(cos_dn, 1.0 / blend));</span><span data-v-c2b1f83f="" class="line"> gl_FragColor = mix(refraction, reflection, lerpFactor);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return;</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec3 tangent = vr_TexTangent;</span><span data-v-c2b1f83f="" class="line"> vec3 binormal = vr_TexBinormal;</span><span data-v-c2b1f83f="" class="line"> int numSuperSamples = vr_NumSuperSamples;</span><span data-v-c2b1f83f="" class="line"> int superSampleIndex = vr_SuperSampleIndex;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> float sum = 0.0;</span><span data-v-c2b1f83f="" class="line"> float weights[requiredSamples];</span><span data-v-c2b1f83f="" class="line"> vec4 samples[requiredSamples];</span><span data-v-c2b1f83f="" class="line"> vec4 result = vec4(0.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // determine how much more samples will be taken for this hit point</span><span data-v-c2b1f83f="" class="line"> int nSamples = (requiredSamples > numSuperSamples) ? requiredSamples : numSuperSamples; // max</span><span data-v-c2b1f83f="" class="line"> nSamples /= numSuperSamples;</span><span data-v-c2b1f83f="" class="line"> int startSampleIndex = superSampleIndex * nSamples;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> options.rayGroup = VR_GLOSSY_DISPERSAL;</span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < nSamples; ++i) {</span><span data-v-c2b1f83f="" class="line"> vec3 randomSample = vr_randomSample(startSampleIndex + i, nSamples);</span><span data-v-c2b1f83f="" class="line"> vec2 offset = randomSample.xy - 0.5;</span><span data-v-c2b1f83f="" class="line"> offset *= (2.0 * amount);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec3 bumpedNormal = normal + offset.x * tangent + offset.y * binormal;</span><span data-v-c2b1f83f="" class="line"> options.normal = bumpedNormal;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> options.rayType = VR_TRACE_REFLECT;</span><span data-v-c2b1f83f="" class="line"> vec4 reflection = vr_trace(options);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> options.rayType = VR_TRACE_REFRACT;</span><span data-v-c2b1f83f="" class="line"> vec4 refraction = vr_trace(options);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> float cos_dn = clamp(-dot(direction, bumpedNormal), 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> float lerpFactor = (1.0 - pow(cos_dn, 1.0 / blend));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> samples[i] = mix(refraction, reflection, lerpFactor);</span><span data-v-c2b1f83f="" class="line"> weights[i] = dot(normal, bumpedNormal);</span><span data-v-c2b1f83f="" class="line"> sum += weights[i];</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> float inverseSum = 1.0 / sum;</span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < nSamples; ++i) {</span><span data-v-c2b1f83f="" class="line"> weights[i] *= inverseSum;</span><span data-v-c2b1f83f="" class="line"> result += weights[i] * samples[i];</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> gl_FragColor = result;</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Glossy Phong


Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">uniform float amount = 0.1;</span><span data-v-c2b1f83f="" class="line">uniform float diffuse_scalar = 0.7;</span><span data-v-c2b1f83f="" class="line">__color uniform vec4 diffuse_color = vec4(0.9, 0.2, 0.8, 1.0);</span><span data-v-c2b1f83f="" class="line">uniform float specular_scalar = 0.06;</span><span data-v-c2b1f83f="" class="line">uniform float specular_shininess = 20.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">const int requiredSamples = 16;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">float phong_specular(vec3 light_dir, vec3 direction, vec3 normal) {</span><span data-v-c2b1f83f="" class="line"> vec3 reflection = reflect(direction, normal);</span><span data-v-c2b1f83f="" class="line"> float cos_rl = clamp(dot(reflection, light_dir), 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> return (pow(cos_rl, specular_shininess) * (specular_shininess + 2.0));</span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> bool isGIRay = ((vr_RayFlags & VR_INDIRECT_FLAG) != 0);</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"> vec3 direction = vr_Direction;</span><span data-v-c2b1f83f="" class="line"> vec3 position = vr_Position;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 raw_diffuse = vec4(vec3(diffuse_color) * diffuse_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 raw_specular = vec4(vec3(specular_scalar), 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 temp = raw_diffuse + raw_specular;</span><span data-v-c2b1f83f="" class="line"> float max_color_comp = max(max(temp.r,temp.g),temp.b);</span><span data-v-c2b1f83f="" class="line"> if (max_color_comp > 1.0) {</span><span data-v-c2b1f83f="" class="line"> raw_diffuse.rgb /= max_color_comp;</span><span data-v-c2b1f83f="" class="line"> raw_specular.rgb /= max_color_comp;</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 diffuse_contrib = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 specular_contrib = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // if this is a GI ray do not try to estimate glossy highlights accurately</span><span data-v-c2b1f83f="" class="line"> if(isGIRay) {</span><span data-v-c2b1f83f="" class="line"> vr_LightIterator light;</span><span data-v-c2b1f83f="" class="line"> for(int j = 0; j < vr_NumLights; ++j) {</span><span data-v-c2b1f83f="" class="line"> vr_evalLight(j, position, normal, light);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> float cos_nl = clamp(light.dot_nl, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> if (cos_nl > 0.0) {</span><span data-v-c2b1f83f="" class="line"> diffuse_contrib += vec4(cos_nl * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> float specular_coeff = phong_specular(light.direction, direction, normal);</span><span data-v-c2b1f83f="" class="line"> specular_contrib += vec4(specular_coeff * cos_nl * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> } else {</span><span data-v-c2b1f83f="" class="line"> vec3 tangent = vr_TexTangent;</span><span data-v-c2b1f83f="" class="line"> vec3 binormal = vr_TexBinormal;</span><span data-v-c2b1f83f="" class="line"> int numSuperSamples = vr_NumSuperSamples;</span><span data-v-c2b1f83f="" class="line"> int superSampleIndex = vr_SuperSampleIndex;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> float sum = 0.0;</span><span data-v-c2b1f83f="" class="line"> float weights[requiredSamples];</span><span data-v-c2b1f83f="" class="line"> vec4 specular_samples[requiredSamples];</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // determine how much more samples will be taken for this hit point</span><span data-v-c2b1f83f="" class="line"> int nSamples = (requiredSamples > numSuperSamples) ? requiredSamples : numSuperSamples; // max</span><span data-v-c2b1f83f="" class="line"> nSamples /= numSuperSamples;</span><span data-v-c2b1f83f="" class="line"> int startSampleIndex = superSampleIndex * nSamples;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < nSamples; ++i) {</span><span data-v-c2b1f83f="" class="line"> vec3 randomSample = vr_randomSample(startSampleIndex + i, nSamples);</span><span data-v-c2b1f83f="" class="line"> vec2 offset = (randomSample.xy - 0.5) * 2.0;</span><span data-v-c2b1f83f="" class="line"> offset *= amount;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec3 bumpedNormal = normalize(normal + offset.x * tangent + offset.y * binormal);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vr_LightIterator light;</span><span data-v-c2b1f83f="" class="line"> for(int j = 0; j < vr_NumLights; ++j) {</span><span data-v-c2b1f83f="" class="line"> vr_evalLight(j, position, bumpedNormal, light);</span><span data-v-c2b1f83f="" class="line"> float cos_nl = clamp(light.dot_nl, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> if(cos_nl > 0.0) {</span><span data-v-c2b1f83f="" class="line"> diffuse_contrib += vec4(cos_nl * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> float specular_coeff = phong_specular(light.direction, direction, bumpedNormal);</span><span data-v-c2b1f83f="" class="line"> specular_samples[i] += vec4(specular_coeff * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> weights[i] = dot(normal, bumpedNormal);</span><span data-v-c2b1f83f="" class="line"> sum += weights[i];</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> float inverseSum = 1.0 / sum;</span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < nSamples; ++i) {</span><span data-v-c2b1f83f="" class="line"> weights[i] *= inverseSum;</span><span data-v-c2b1f83f="" class="line"> specular_contrib += weights[i] * specular_samples[i];</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> diffuse_contrib /= float(nSamples);</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> diffuse_contrib += vec4(vr_irradiance(normal, 1.0), 0.0);</span><span data-v-c2b1f83f="" class="line"> diffuse_contrib *= raw_diffuse;</span><span data-v-c2b1f83f="" class="line"> specular_contrib *= raw_specular;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> gl_FragColor = diffuse_contrib + specular_contrib;</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Glossy Reflection

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">uniform float amount = 0.1;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">const int requiredSamples = 16;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vr_TraceOptions options;</span><span data-v-c2b1f83f="" class="line"> options.rayType = VR_TRACE_REFLECT;</span><span data-v-c2b1f83f="" class="line"> options.rayGroup = VR_SPECULAR_DISPERSAL;</span><span data-v-c2b1f83f="" class="line"> options.normal = normal;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if((vr_RayFlags & VR_INDIRECT_FLAG) != 0) {</span><span data-v-c2b1f83f="" class="line"> gl_FragColor = vr_trace(options);</span><span data-v-c2b1f83f="" class="line"> return;</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec3 tangent = vr_TexTangent;</span><span data-v-c2b1f83f="" class="line"> vec3 binormal = vr_TexBinormal;</span><span data-v-c2b1f83f="" class="line"> int numSuperSamples = vr_NumSuperSamples;</span><span data-v-c2b1f83f="" class="line"> int superSampleIndex = vr_SuperSampleIndex;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> float sum = 0.0;</span><span data-v-c2b1f83f="" class="line"> float weights[requiredSamples];</span><span data-v-c2b1f83f="" class="line"> vec4 samples[requiredSamples];</span><span data-v-c2b1f83f="" class="line"> vec4 result = vec4(0.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // determine how much more samples will be taken for this hit point</span><span data-v-c2b1f83f="" class="line"> int nSamples = (requiredSamples > numSuperSamples) ? requiredSamples : numSuperSamples; // max</span><span data-v-c2b1f83f="" class="line"> nSamples /= numSuperSamples;</span><span data-v-c2b1f83f="" class="line"> int startSampleIndex = superSampleIndex * nSamples;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> options.rayGroup = VR_GLOSSY_DISPERSAL;</span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < nSamples; ++i) {</span><span data-v-c2b1f83f="" class="line"> vec3 randomSample = vr_randomSample(startSampleIndex + i, nSamples);</span><span data-v-c2b1f83f="" class="line"> vec2 offset = (randomSample.xy - 0.5) * 2.0;</span><span data-v-c2b1f83f="" class="line"> offset *= amount;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec3 bumpedNormal = normalize(normal + offset.x * tangent + offset.y * binormal);</span><span data-v-c2b1f83f="" class="line"> options.normal = bumpedNormal;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> samples[i] = vr_trace(options);</span><span data-v-c2b1f83f="" class="line"> weights[i] = dot(normal, bumpedNormal);</span><span data-v-c2b1f83f="" class="line"> sum += weights[i];</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> float inverseSum = 1.0 / sum;</span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < nSamples; ++i) {</span><span data-v-c2b1f83f="" class="line"> weights[i] *= inverseSum;</span><span data-v-c2b1f83f="" class="line"> result += weights[i] * samples[i];</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> gl_FragColor = result;</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Oren-Nayar

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">__color uniform vec4 diffuse_color = vec4(1.0, 1.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line">uniform float diffuse_scalar = 0.7;</span><span data-v-c2b1f83f="" class="line">__color uniform vec4 specular_color = vec4(1.0, 1.0, 1.0 ,1.0);</span><span data-v-c2b1f83f="" class="line">uniform float specular_scalar = 0.06;</span><span data-v-c2b1f83f="" class="line">uniform float diffuse_deviation = 0.5;</span><span data-v-c2b1f83f="" class="line">uniform float specular_shininess = 10.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">float orennayar_diffuse(vec3 light_dir, vec3 view_dir, vec3 normal) {</span><span data-v-c2b1f83f="" class="line"> float sigma_sqred = diffuse_deviation * diffuse_deviation;</span><span data-v-c2b1f83f="" class="line"> float A = 1.0 - (sigma_sqred / (2.0 * (sigma_sqred + 0.33)));</span><span data-v-c2b1f83f="" class="line"> float B = (0.45 * sigma_sqred) / (sigma_sqred + 0.09);</span><span data-v-c2b1f83f="" class="line"> float cosThetaI = dot(light_dir, normal);</span><span data-v-c2b1f83f="" class="line"> float cosThetaO = -dot(view_dir, normal);</span><span data-v-c2b1f83f="" class="line"> float sinThetaI = sqrt(max(0.0, 1.0 - (cosThetaI * cosThetaI)));</span><span data-v-c2b1f83f="" class="line"> float sinThetaO = sqrt(max(0.0, 1.0 - (cosThetaO * cosThetaO)));</span><span data-v-c2b1f83f="" class="line"> float cosPhiI = dot(light_dir, vr_TexTangent);</span><span data-v-c2b1f83f="" class="line"> float cosPhiO = -dot(view_dir, vr_TexTangent);</span><span data-v-c2b1f83f="" class="line"> float sinPhiI = sqrt(max(0.0, 1.0 - (cosPhiI * cosPhiI)));</span><span data-v-c2b1f83f="" class="line"> float sinPhiO = sqrt(max(0.0, 1.0 - (cosPhiO * cosPhiO)));</span><span data-v-c2b1f83f="" class="line"> float temp = max(0.0, (cosPhiI * cosPhiO) + (sinPhiI * sinPhiO));</span><span data-v-c2b1f83f="" class="line"> float sinAlpha;</span><span data-v-c2b1f83f="" class="line"> float tanBeta;</span><span data-v-c2b1f83f="" class="line"> if (cosThetaI > cosThetaO) {</span><span data-v-c2b1f83f="" class="line"> sinAlpha = sinThetaO;</span><span data-v-c2b1f83f="" class="line"> tanBeta = (sinThetaI / cosThetaI);</span><span data-v-c2b1f83f="" class="line"> } else {</span><span data-v-c2b1f83f="" class="line"> sinAlpha = sinThetaI;</span><span data-v-c2b1f83f="" class="line"> tanBeta = (sinThetaO / cosThetaO);</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> float result = (A + (B * temp * sinAlpha * tanBeta));</span><span data-v-c2b1f83f="" class="line"> return clamp(result, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line">float phong_specular(vec3 light_dir, vec3 view_dir, vec3 normal) {</span><span data-v-c2b1f83f="" class="line"> vec3 reflection = reflect(view_dir, normal);</span><span data-v-c2b1f83f="" class="line"> float cos_rl = clamp(dot(reflection, light_dir), 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> return (pow(cos_rl, specular_shininess) * (specular_shininess + 2.0));</span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"> vec4 diffuse = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 specular = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 diffuse_contrib = vec4(vec3(diffuse_color) * diffuse_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 specular_contrib = vec4(vec3(specular_color) * specular_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 temp = diffuse_contrib + specular_contrib;</span><span data-v-c2b1f83f="" class="line"> float max_color_component = max(max(temp.r,temp.g),temp.b);</span><span data-v-c2b1f83f="" class="line"> if (max_color_component > 1.0) {</span><span data-v-c2b1f83f="" class="line"> diffuse_contrib.rgb /= max_color_component;</span><span data-v-c2b1f83f="" class="line"> specular_contrib.rgb /= max_color_component;</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec3 view_dir = vr_Direction;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vr_LightIterator lightIter;</span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < vr_NumLights; ++i) {</span><span data-v-c2b1f83f="" class="line"> vr_evalLight(i, vr_Position, normal, lightIter);</span><span data-v-c2b1f83f="" class="line"> float cos_nl = clamp(lightIter.dot_nl, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> if (cos_nl > 0.0) {</span><span data-v-c2b1f83f="" class="line"> float diffuse_term = orennayar_diffuse(lightIter.direction, view_dir, normal);</span><span data-v-c2b1f83f="" class="line"> diffuse += vec4(vec3(diffuse_term * cos_nl) * lightIter.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> float specular_term = phong_specular(lightIter.direction, view_dir, normal);</span><span data-v-c2b1f83f="" class="line"> specular += vec4(vec3(specular_term * cos_nl) * lightIter.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> diffuse *= diffuse_contrib;</span><span data-v-c2b1f83f="" class="line"> specular *= specular_contrib;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec3 gi_contrib = vr_irradiance(normal, 1.0);</span><span data-v-c2b1f83f="" class="line"> diffuse += vec4(vec3(diffuse_contrib) * gi_contrib, 0.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> gl_FragColor = diffuse + specular;</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Turbulence

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">uniform float noise_scale = 2.0;</span><span data-v-c2b1f83f="" class="line">uniform float noise_gain = 0.8;</span><span data-v-c2b1f83f="" class="line">uniform float noise_lacunarity = 3.0;</span><span data-v-c2b1f83f="" class="line">__color uniform vec4 color1 = vec4(1.0, 1.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line">__color uniform vec4 color2 = vec4(1.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line">uniform float diffuse_scalar = 0.8;</span><span data-v-c2b1f83f="" class="line">uniform float specular_scalar = 0.02;</span><span data-v-c2b1f83f="" class="line">uniform float specular_shininess = 10.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">const int octaves_count = 4;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">float phong_specular(vec3 light_dir, vec3 view_dir, vec3 normal, float specular_shininess) {</span><span data-v-c2b1f83f="" class="line"> vec3 reflection = reflect(view_dir, normal);</span><span data-v-c2b1f83f="" class="line"> float cos_rl = clamp(dot(reflection, light_dir), 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> return (pow(cos_rl, specular_shininess) * (specular_shininess + 2.0));</span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"> vec3 position = vr_Position;</span><span data-v-c2b1f83f="" class="line"> vec3 direction = vr_Direction;</span><span data-v-c2b1f83f="" class="line"> vec3 noise_position = vec3(gl_TexCoord[0]);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec3 scaled_position = noise_position * vec3(noise_scale);</span><span data-v-c2b1f83f="" class="line"> float noise_amplitude = 2.0;</span><span data-v-c2b1f83f="" class="line"> float noise_frequency = 0.5;</span><span data-v-c2b1f83f="" class="line"> vec3 noise_value = vec3(0.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if((vr_RayFlags & VR_INDIRECT_FLAG) != 0) {</span><span data-v-c2b1f83f="" class="line"> noise_value = vec3(0.5);</span><span data-v-c2b1f83f="" class="line"> } else {</span><span data-v-c2b1f83f="" class="line"> for (int i = 0; i < octaves_count; ++i) {</span><span data-v-c2b1f83f="" class="line"> noise_value += abs(noise3(scaled_position * vec3(noise_frequency))) * vec3(noise_amplitude);</span><span data-v-c2b1f83f="" class="line"> noise_frequency *= noise_lacunarity;</span><span data-v-c2b1f83f="" class="line"> noise_amplitude *= noise_gain;</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 diffuse_color = mix(color1, color2, vec4(noise_value, 1.0));</span><span data-v-c2b1f83f="" class="line"> vec4 specular_color = vec4(1.0, 1.0, 1.0, 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 diffuse = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 specular = vec4(0.0, 0.0, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 raw_diffuse = vec4(vec3(diffuse_color) * diffuse_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"> vec4 raw_specular = vec4(vec3(specular_color) * specular_scalar, 1.0);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec4 temp = raw_diffuse + raw_specular;</span><span data-v-c2b1f83f="" class="line"> float max_color_comp = max(max(temp.r,temp.g),temp.b);</span><span data-v-c2b1f83f="" class="line"> if (max_color_comp > 1.0) {</span><span data-v-c2b1f83f="" class="line"> raw_diffuse.rgb /= max_color_comp;</span><span data-v-c2b1f83f="" class="line"> raw_specular.rgb /= max_color_comp;</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vr_LightIterator light;</span><span data-v-c2b1f83f="" class="line"> for(int i = 0; i < vr_NumLights; ++i) {</span><span data-v-c2b1f83f="" class="line"> vr_evalLight(i, position, normal, light);</span><span data-v-c2b1f83f="" class="line"> float cos_nl = clamp(light.dot_nl, 0.0, 1.0);</span><span data-v-c2b1f83f="" class="line"> if (cos_nl > 0.0) {</span><span data-v-c2b1f83f="" class="line"> diffuse += vec4(vec3(cos_nl) * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> float specular_coeff = phong_specular(light.direction, direction, normal, specular_shininess);</span><span data-v-c2b1f83f="" class="line"> specular += vec4(vec3(specular_coeff * cos_nl) * light.contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> diffuse *= raw_diffuse;</span><span data-v-c2b1f83f="" class="line"> specular *= raw_specular;</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> vec3 gi_contribution = vr_irradiance(normal, 1.0);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> diffuse += vec4(raw_diffuse.rgb * gi_contribution, 0.0);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"> gl_FragColor = diffuse + specular;</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Blinn Material

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">uniform sampler2D diffuseTex;</span><span data-v-c2b1f83f="" class="line">__color uniform vec4 specular = vec4(1.0, 1.0, 1.0, 1.0);</span><span data-v-c2b1f83f="" class="line">uniform float highlightGlossiness = 0.8;</span><span data-v-c2b1f83f="" class="line">uniform sampler2D anisotropyTex;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"> vec2 uv_coords = vec2(gl_TexCoord[0]);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vr_DiffuseBRDFSettings diffuseSettings;</span><span data-v-c2b1f83f="" class="line"> diffuseSettings.color = vec3(texture2D(diffuseTex, uv_coords));</span><span data-v-c2b1f83f="" class="line"> diffuseSettings.normal = normal;</span><span data-v-c2b1f83f="" class="line"> vr_brdf_diffuse(diffuseSettings);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vr_GlossyBRDFSettings blinnSettings;</span><span data-v-c2b1f83f="" class="line"> blinnSettings.color = vec3(specular);</span><span data-v-c2b1f83f="" class="line"> blinnSettings.normal = normal;</span><span data-v-c2b1f83f="" class="line"> blinnSettings.highlightGlossiness = highlightGlossiness;</span><span data-v-c2b1f83f="" class="line"> blinnSettings.anisotropy = 2.0 * texture2D(anisotropyTex, uv_coords).x - 1.0;</span><span data-v-c2b1f83f="" class="line"> blinnSettings.traceReflections = false;</span><span data-v-c2b1f83f="" class="line"> vr_brdf_blinn(blinnSettings);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> gl_FragColor = vec4(vec3(0.0), 1.0);</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Transparent Material

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">__color uniform vec4 diffuse = vec4(0.6, 0.2, 1.0, 1.0);</span><span data-v-c2b1f83f="" class="line">uniform sampler2D transparency;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vr_DiffuseBRDFSettings diffuseSettings;</span><span data-v-c2b1f83f="" class="line"> diffuseSettings.color = vec3(diffuse);</span><span data-v-c2b1f83f="" class="line"> diffuseSettings.normal = normal;</span><span data-v-c2b1f83f="" class="line"> vr_brdf_diffuse(diffuseSettings);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vec3 textureSample = vec3(texture2D(transparency, vec2(gl_TexCoord[0])));</span><span data-v-c2b1f83f="" class="line"> float alpha = dot(textureSample, vec3(0.3333333));</span><span data-v-c2b1f83f="" class="line"> gl_FragColor = vec4(vec3(0.0), alpha);</span><span data-v-c2b1f83f="" class="line">}</span></code>
Example: Render Channels

Rendered shader

Shader parameters
<code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#version 110</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">__color uniform vec4 diffuse = vec4(0.3, 0.8, 0.2, 1.0);</span><span data-v-c2b1f83f="" class="line">__channel vec3 NormalSpace = vec3(0.314);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void main() {</span><span data-v-c2b1f83f="" class="line"> vec3 normal = (gl_FrontFacing) ? vr_Normal : -vr_Normal;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> NormalSpace = normal;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vr_DiffuseBRDFSettings diffuseSettings;</span><span data-v-c2b1f83f="" class="line"> diffuseSettings.color = vec3(diffuse);</span><span data-v-c2b1f83f="" class="line"> diffuseSettings.normal = normal;</span><span data-v-c2b1f83f="" class="line"> vr_brdf_diffuse(diffuseSettings);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> gl_FragColor.a = 1.0;</span><span data-v-c2b1f83f="" class="line">}</span></code>
Notes
- OpenGL Shading Language specification officially supported is 1.10.59
- texture() is a synonym for texture2D(). It was added for compatibility with shaders written in GLSL 1.5. The V-Ray implementation of GLSL follows the GLSL 1.10 specification, but with a bunch of extensions to support more modern codebases. The texture() function overload is one of them. Additionally, there is another set of texture overloads: vec4 texture2D(sampler2D sampler, int reserved) and vec4 texture(sampler2D sampler, int reserved), which are equivalent. They can be used to sample the given texture at the current UV-coordinates of the current intersection point, as these overloads do not require to explicitly specify a coord argument. The reserved parameter is not used and should be -1. These fixed-coordinates sampling functions are only available in V-Ray though and ideally one should guard such calls in #ifdef _VRAY_GLSL_ blocks.