uniform highp mat4 MVP; uniform highp vec3 minBounds; uniform highp vec3 maxBounds; uniform highp vec3 cameraPositionRelativeToModel; attribute highp vec3 vertexPosition_mdl; attribute highp vec2 vertexUV; attribute highp vec3 vertexNormal_mdl; varying highp vec3 pos; varying highp vec3 rayDir; void main() { gl_Position = MVP * vec4(vertexPosition_mdl, 1.0); highp vec3 minBoundsNorm = minBounds; highp vec3 maxBoundsNorm = maxBounds; // Y and Z are flipped in bounds to be directly usable in texture calculations, // so flip them back to normal for position calculations minBoundsNorm.yz = -minBoundsNorm.yz; maxBoundsNorm.yz = -maxBoundsNorm.yz; minBoundsNorm = 0.5 * (minBoundsNorm + 1.0); maxBoundsNorm = 0.5 * (maxBoundsNorm + 1.0); pos = vertexPosition_mdl + ((1.0 - vertexPosition_mdl) * minBoundsNorm) - ((1.0 + vertexPosition_mdl) * (1.0 - maxBoundsNorm)); rayDir = -(cameraPositionRelativeToModel - pos); // Flip Y and Z so QImage bits work directly for texture and first image is in the front rayDir.yz = -rayDir.yz; pos.yz = -pos.yz; }