Guest User

MSAA

a guest
Jun 17th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. //Here i calculate every barycentric coordinate for every subpixel to check if it is inside triangle
  2. float maxy = rt->curH + 1.f;
  3. float maxx = rt->curW + 1.f;
  4.  
  5. float stepstart = 0.5f / rt->renderer->samplestep; //for st = 2 step is .25 for st = 4 0.125
  6. float step = 2.f*stepstart; //distance between
  7.  
  8. vec3_t subpixel = {0.f, 0.f, 0.f};
  9. vec3_t subbc, bcsum;
  10. bool first = true;
  11. bool subsuccess;
  12. vec3_t *limitvec;
  13. for (float cury = rt->curH + stepstart; cury < maxy && cury < rt->maxy ; cury += step)
  14. {
  15. for (float curx = rt->curW + stepstart; curx < maxx && curx < rt->maxx ; curx += step)
  16. {
  17. subpixel.coords.x = curx;
  18. subpixel.coords.y = cury;
  19. //printf("subpx: %f %f\n", curx, cury);
  20. if ( isline(rt->shape) )
  21. {
  22. float edge = place_of_vec3(rt->pRaster[0], rt->pRaster[1], &subpixel);
  23. limitvec = vec3_sub_new(rt->pRaster[0], rt->pRaster[1]);
  24. vec3_length(limitvec);
  25. float limit = vec3_length(limitvec) *0.5f;
  26. if ( (edge <= limit && edge >= 0.f || edge >= -limit && edge <= 0.f) )
  27. {
  28. subsuccess = true;
  29. }
  30. free(limitvec);
  31. } else
  32. {
  33. subsuccess = is_inside_triangle( rt->pRaster[0], rt->pRaster[1], rt->pRaster[2], &subpixel, &subbc);
  34. }
  35.  
  36. if(subsuccess)
  37. {
  38. if (first)
  39. {
  40. vec3_copy_dest(&bcsum,&subbc);
  41. first = false;
  42. rt->isVisible = true;
  43. } else
  44. {
  45. vec3_add(&bcsum,&subbc);
  46. }
  47.  
  48. ++rt->cntsamplesuccess;
  49. }
  50. }
  51. }
  52.  
  53. if(rt->isVisible)
  54. {
  55. vec3_set_values(&rt->bc, bcsum.coords.x / rt->cntsamplesuccess,
  56. bcsum.coords.y / rt->cntsamplesuccess,
  57. bcsum.coords.z / rt->cntsamplesuccess);
  58. }
  59.  
  60. //later in the code i use this results for coloring
  61.  
  62. if (rt->renderer->samplestep > 1.f )
  63. {
  64. float st = rt->renderer->samplestep*rt->renderer->samplestep;
  65. float fail = st - rt->cntsamplesuccess;
  66.  
  67. cRGB_t subcolsucc = { curCol1.r * rt->cntsamplesuccess,
  68. curCol1.g * rt->cntsamplesuccess,
  69. curCol1.b * rt->cntsamplesuccess };
  70. cRGB_t bufcol = rt->renderer->frameBuffer[bi/*rt->bufferIndex*/];
  71. cRGB_t subcolfail = { bufcol.r * fail,
  72. bufcol.g * fail,
  73. bufcol.b * fail};
  74. crgb_crgb_add(&subcolsucc, &subcolfail);
  75. crgb_mul(&subcolsucc, 1.f/st);
  76. crgb_crgb_copy(&curCol1, &subcolsucc);
  77. }
  78.  
  79. crgb_crgb_copy(&rt->renderer->frameBuffer[bi/*rt->bufferIndex*/], &curCol1);
Advertisement
Add Comment
Please, Sign In to add comment