Advertisement
Guest User

Untitled

a guest
Apr 19th, 2014
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. // tex is a texture with each slice of the cube placed horizontally across the texture.
  2. // texCoord is a 3d texture coord
  3. // size is the size if the cube in pixels.
  4.  
  5. vec4 sampleAs3DTexture(sampler2D tex, vec3 texCoord, float size) {
  6. float sliceSize = 1.0 / size; // space of 1 slice
  7. float slicePixelSize = sliceSize / size; // space of 1 pixel
  8. float sliceInnerSize = slicePixelSize * (size - 1.0); // space of size pixels
  9. float zSlice0 = min(floor(texCoord.z * size), size - 1.0);
  10. float zSlice1 = min(zSlice0 + 1.0, size - 1.0);
  11. float xOffset = slicePixelSize * 0.5 + texCoord.x * sliceInnerSize;
  12. float s0 = xOffset + (zSlice0 * sliceSize);
  13. float s1 = xOffset + (zSlice1 * sliceSize);
  14. vec4 slice0Color = texture2D(tex, vec2(s0, texCoord.y));
  15. vec4 slice1Color = texture2D(tex, vec2(s1, texCoord.y));
  16. float zOffset = mod(texCoord.z * size, 1.0);
  17. return mix(slice0Color, slice1Color, zOffset);
  18. }
  19.  
  20. // tex is a texture with each slice of the cube placed in grid in a texture.
  21. // texCoord is a 3d texture coord
  22. // size is the size if the cube in pixels.
  23. // slicesPerRow is how many slices there are across the texture
  24. // numRows is the number of rows of slices
  25.  
  26. vec2 computeSliceOffset(float slice, float slicesPerRow, vec2 sliceSize) {
  27. return sliceSize * vec2(mod(slice, slicesPerRow),
  28. floor(slice / slicesPerRow));
  29. }
  30.  
  31. vec4 sampleAs3DTexture(
  32. sampler2D tex, vec3 texCoord, float size, float numRows, float slicesPerRow) {
  33. float slice = texCoord.z * size;
  34. float sliceZ = floor(slice); // slice we need
  35. float zOffset = fract(slice); // dist between slices
  36.  
  37. vec2 sliceSize = vec2(1.0 / slicesPerRow, // u space of 1 slice
  38. 1.0 / numRows); // v space of 1 slice
  39.  
  40. vec2 slice0Offset = computeSliceOffset(sliceZ, slicesPerRow, sliceSize);
  41. vec2 slice1Offset = computeSliceOffset(sliceZ + 1.0, slicesPerRow, sliceSize);
  42.  
  43. vec2 slicePixelSize = sliceSize / size; // space of 1 pixel
  44. vec2 sliceInnerSize = slicePixelSize * (size - 1.0); // space of size pixels
  45.  
  46. vec2 uv = slicePixelSize * 0.5 + texCoord.xy * sliceInnerSize;
  47. vec4 slice0Color = texture2D(tex, slice0Offset + uv);
  48. vec4 slice1Color = texture2D(tex, slice1Offset + uv);
  49. return mix(slice0Color, slice1Color, zOffset);
  50. return slice0Color;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement