1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
/*=========================================================================
Program: Visualization Toolkit
Module: vtkGPUVolumeRayCastMapper_PerspectiveProjectionFS.glsl
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// Perspective projection.
#version 110
// Entry position (global scope)
vec3 pos;
// Incremental vector in texture space (global scope)
vec3 rayDir;
// Camera position in texture space
uniform vec3 cameraPosition;
// Sample distance in world space
uniform float sampleDistance;
// Matrix coefficients: diagonal (a11,a22,a33)
uniform vec3 matrix1;
// Matrix coefficients: others (2a12,2a23,2a13)
uniform vec3 matrix2;
// Defined in the right projection method.
void incrementalRayDirection()
{
// Direction of the ray in texture space, not normalized.
rayDir=pos-cameraPosition;
// x^2, y^2, z^2
vec3 normDir=rayDir*rayDir;
normDir.x=dot(normDir,matrix1);
// xy,yz,zx
vec3 coefs=rayDir*rayDir.yxz;
coefs.x=dot(coefs,matrix2);
// n^2
normDir.x=normDir.x+coefs.x;
// 1/n
// normDir=1/sqrt(normDir)
normDir.x=inversesqrt(normDir.x);
// Final scale factor for the ray direction in texture space
// normDir=normDir*sampleDistance
normDir.x=normDir.x*sampleDistance;
// Now, rayDir is the incremental direction in texture space
rayDir=rayDir*normDir.x;
}
|