Rev 5208 | Rev 5939 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5208 | Rev 5922 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ; |
1 | ; |
2 | ; We draw a triangle with various interpolations |
2 | ; We draw a triangle with various interpolations |
3 | ; |
3 | ; |
- | 4 | ; Порядок преобразований цветов вершин: |
|
- | 5 | ; ZBufferPoint.r -> r1 (+drdl_min or +drdl_max) -> or1 (+drdx) -> [pixel buffer] |
|
- | 6 | ; ZBufferPoint.g -> g1 (+dgdl_min or +dgdl_max) -> og1 (+dgdx) -> [pixel buffer] |
|
- | 7 | ; ZBufferPoint.b -> b1 (+dbdl_min or +dbdl_max) -> ob1 (+dbdx) -> [pixel buffer] |
|
- | 8 | ; |
|
- | 9 | ; В некоторых случаях значения цвета (во 2-м байте переменных: or1,og1,ob1) |
|
- | 10 | ; может становиться < 0 или > 255, тогда появляються пиксели не правильного |
|
- | 11 | ; цвета. Скорее всего это связано с ошибками округления дробных чисел, |
|
- | 12 | ; при вычислении коэфициентов для плавного перехода цвета. |
|
- | 13 | ; |
|
- | 14 | ; Для лечения этой проблемы в версии на C++ специально ограничиваються |
|
- | 15 | ; минимальные и максимальные значения цвета точек (например от 3 до 252). |
|
- | 16 | ; Потому цвета граней могут немного отличаться от указанных в программе. |
|
- | 17 | ; |
|
- | 18 | ; В даной версии алгоритм немного другой. В наиболее вероятных местах появления |
|
- | 19 | ; пикселей не правильного цвета (обычно начало и конец линии) иправляеться |
|
- | 20 | ; цвет испорченных пикселей. Цвет получаеться наиболее близким к указанному |
|
- | 21 | ; пользователем. |
|
- | 22 | ||
4 | t dd ? ;ZBufferPoint* |
23 | t dd ? ;ZBufferPoint* |
5 | pr1 dd ? ;ZBufferPoint* |
24 | pr1 dd ? ;ZBufferPoint* |
6 | pr2 dd ? ;ZBufferPoint* |
25 | pr2 dd ? ;ZBufferPoint* |
7 | l1 dd ? ;ZBufferPoint* |
26 | l1 dd ? ;ZBufferPoint* |
8 | l2 dd ? ;ZBufferPoint* |
27 | l2 dd ? ;ZBufferPoint* |
Line 697... | Line 716... | ||
697 | mov eax,[z1] |
716 | mov eax,[z1] |
698 | mov [z],eax |
717 | mov [z],eax |
699 | end if |
718 | end if |
700 | if INTERP_RGB eq 1 |
719 | if INTERP_RGB eq 1 |
701 | mov eax,[r1] |
720 | mov eax,[r1] |
- | 721 | bt eax,31 ; коректирование испорченных пикселей (в начале линии) |
|
- | 722 | jnc @f |
|
- | 723 | xor eax,eax |
|
- | 724 | @@: |
|
- | 725 | bt eax,16 |
|
- | 726 | jnc @f |
|
- | 727 | mov eax,0xff00 |
|
- | 728 | @@: |
|
702 | mov [or1],eax |
729 | mov [or1],eax |
703 | mov eax,[g1] |
730 | mov eax,[g1] |
- | 731 | bt eax,31 |
|
- | 732 | jnc @f |
|
- | 733 | xor eax,eax |
|
- | 734 | @@: |
|
- | 735 | bt eax,16 |
|
- | 736 | jnc @f |
|
- | 737 | mov eax,0xff00 |
|
- | 738 | @@: |
|
704 | mov [og1],eax |
739 | mov [og1],eax |
705 | mov eax,[b1] |
740 | mov eax,[b1] |
- | 741 | bt eax,31 |
|
- | 742 | jnc @f |
|
- | 743 | xor eax,eax |
|
- | 744 | @@: |
|
- | 745 | bt eax,16 |
|
- | 746 | jnc @f |
|
- | 747 | mov eax,0xff00 |
|
- | 748 | @@: |
|
706 | mov [ob1],eax |
749 | mov [ob1],eax |
707 | end if |
750 | end if |
708 | if INTERP_ST eq 1 |
751 | if INTERP_ST eq 1 |
709 | mov eax,[s1] |
752 | mov eax,[s1] |
710 | mov [s],eax |
753 | mov [s],eax |
Line 718... | Line 761... | ||
718 | mov [t_z],eax |
761 | mov [t_z],eax |
719 | end if |
762 | end if |
Line 720... | Line 763... | ||
720 | 763 | ||
721 | align 4 |
764 | align 4 |
- | 765 | .cycle_1: ;while (n>=3) |
|
- | 766 | if INTERP_RGB eq 1 |
|
- | 767 | cmp dword[n],5 |
|
- | 768 | jl .cycle_2 |
|
722 | .cycle_1: ;while (n>=3) |
769 | else |
723 | cmp dword[n],3 |
770 | cmp dword[n],3 |
- | 771 | jl .cycle_2 |
|
724 | jl .cycle_2 |
772 | end if |
725 | PUT_PIXEL 0 |
773 | PUT_PIXEL 0 |
726 | PUT_PIXEL 1 |
774 | PUT_PIXEL 1 |
727 | PUT_PIXEL 2 |
775 | PUT_PIXEL 2 |
728 | PUT_PIXEL 3 |
776 | PUT_PIXEL 3 |
Line 731... | Line 779... | ||
731 | end if |
779 | end if |
732 | add edi,4*PSZB |
780 | add edi,4*PSZB |
733 | sub dword[n],4 |
781 | sub dword[n],4 |
734 | jmp .cycle_1 |
782 | jmp .cycle_1 |
735 | .cycle_2: ;while (n>=0) |
783 | .cycle_2: ;while (n>=0) |
- | 784 | if INTERP_RGB eq 1 |
|
- | 785 | ; коректирование испорченных пикселей (в конце линии) |
|
- | 786 | bt dword[or1],31 |
|
- | 787 | jnc @f |
|
- | 788 | mov dword[or1],0 |
|
- | 789 | jmp .end_r |
|
- | 790 | @@: |
|
- | 791 | bt dword[or1],16 |
|
- | 792 | jnc .end_r |
|
- | 793 | mov dword[or1],0xff00 |
|
- | 794 | .end_r: |
|
- | 795 | bt dword[og1],31 |
|
- | 796 | jnc @f |
|
- | 797 | mov dword[og1],0 |
|
- | 798 | jmp .end_g |
|
- | 799 | @@: |
|
- | 800 | bt dword[og1],16 |
|
- | 801 | jnc .end_g |
|
- | 802 | mov dword[og1],0xff00 |
|
- | 803 | .end_g: |
|
- | 804 | bt dword[ob1],31 |
|
- | 805 | jnc @f |
|
- | 806 | mov dword[ob1],0 |
|
- | 807 | jmp .end_b |
|
- | 808 | @@: |
|
- | 809 | bt dword[ob1],16 |
|
- | 810 | jnc .end_b |
|
- | 811 | mov dword[ob1],0xff00 |
|
- | 812 | .end_b: |
|
- | 813 | end if |
|
736 | cmp dword[n],0 |
814 | cmp dword[n],0 |
737 | jl .cycle_2_end |
815 | jl .cycle_2_end |
738 | PUT_PIXEL 0 |
816 | PUT_PIXEL 0 |
739 | if INTERP_Z eq 1 |
817 | if INTERP_Z eq 1 |
740 | add dword[pz],2 ;=sizeof(uint) |
818 | add dword[pz],2 ;=sizeof(uint) |