fix interpolated pixels colors

git-svn-id: svn://kolibrios.org@5922 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2015-11-19 23:28:22 +00:00
parent 2f44126352
commit 9780bc0c05
3 changed files with 88 additions and 5 deletions

View File

@ -216,16 +216,19 @@ pushad
jmp .end_f jmp .end_f
.end_spot_c: .end_spot_c:
cmp ecx,GL_CONSTANT_ATTENUATION cmp ecx,GL_CONSTANT_ATTENUATION
jne @f
mov ecx,[ebx+12] mov ecx,[ebx+12]
mov [edi+offs_ligh_attenuation],ecx ;l->attenuation[0]=p[3] mov [edi+offs_ligh_attenuation],ecx ;l->attenuation[0]=p[3]
jmp .end_f jmp .end_f
@@: @@:
cmp ecx,GL_LINEAR_ATTENUATION cmp ecx,GL_LINEAR_ATTENUATION
jne @f
mov ecx,[ebx+12] mov ecx,[ebx+12]
mov [edi+offs_ligh_attenuation+4],ecx ;l->attenuation[1]=p[3] mov [edi+offs_ligh_attenuation+4],ecx ;l->attenuation[1]=p[3]
jmp .end_f jmp .end_f
@@: @@:
cmp ecx,GL_QUADRATIC_ATTENUATION cmp ecx,GL_QUADRATIC_ATTENUATION
jne @f
mov ecx,[ebx+12] mov ecx,[ebx+12]
mov [edi+offs_ligh_attenuation+8],ecx ;l->attenuation[2]=p[3] mov [edi+offs_ligh_attenuation+8],ecx ;l->attenuation[2]=p[3]
jmp .end_f jmp .end_f

View File

@ -82,10 +82,9 @@ local .end_0
;edi = pp ;edi = pp
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24 if TGL_FEATURE_RENDER_BITS eq 24
mov ecx,[og1]
mov eax,[or1] mov eax,[or1]
mov cl,ah mov cl,ah
mov eax,[og1]
mov ch,ah
mov word[edi+3*_a],cx mov word[edi+3*_a],cx
mov eax,[ob1] mov eax,[ob1]
mov byte[edi+3*_a +2],ah mov byte[edi+3*_a +2],ah
@ -200,7 +199,8 @@ local .end_0
mov ebx,[pz] mov ebx,[pz]
cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
jl .end_0 jl .end_0
; pz[_a]=zz; ;edi = pp
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24 if TGL_FEATURE_RENDER_BITS eq 24
; unsigned char *ptr; ; unsigned char *ptr;
; ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3; ; ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3;
@ -258,7 +258,8 @@ local .end_0
mov ebx,[pz] mov ebx,[pz]
cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
jl .end_0 jl .end_0
; pz[_a]=zz; ;edi = pp
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
if TGL_FEATURE_RENDER_BITS eq 24 if TGL_FEATURE_RENDER_BITS eq 24
; unsigned char *ptr; ; unsigned char *ptr;
; ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3; ; ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3;
@ -388,7 +389,8 @@ local .end_0
mov ebx,[pz] mov ebx,[pz]
cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a])
jl .end_0 jl .end_0
; pz[_a]=zz; ;edi = pp
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
fild dword[z] fild dword[z]
fld dword[s_z] fld dword[s_z]
fdiv st0,st1 fdiv st0,st1

View File

@ -1,6 +1,25 @@
; ;
; We draw a triangle with various interpolations ; We draw a triangle with various interpolations
; ;
; Порядок преобразований цветов вершин:
; ZBufferPoint.r -> r1 (+drdl_min or +drdl_max) -> or1 (+drdx) -> [pixel buffer]
; ZBufferPoint.g -> g1 (+dgdl_min or +dgdl_max) -> og1 (+dgdx) -> [pixel buffer]
; ZBufferPoint.b -> b1 (+dbdl_min or +dbdl_max) -> ob1 (+dbdx) -> [pixel buffer]
;
; В некоторых случаях значения цвета (во 2-м байте переменных: or1,og1,ob1)
; может становиться < 0 или > 255, тогда появляються пиксели не правильного
; цвета. Скорее всего это связано с ошибками округления дробных чисел,
; при вычислении коэфициентов для плавного перехода цвета.
;
; Для лечения этой проблемы в версии на C++ специально ограничиваються
; минимальные и максимальные значения цвета точек (например от 3 до 252).
; Потому цвета граней могут немного отличаться от указанных в программе.
;
; В даной версии алгоритм немного другой. В наиболее вероятных местах появления
; пикселей не правильного цвета (обычно начало и конец линии) иправляеться
; цвет испорченных пикселей. Цвет получаеться наиболее близким к указанному
; пользователем.
t dd ? ;ZBufferPoint* t dd ? ;ZBufferPoint*
pr1 dd ? ;ZBufferPoint* pr1 dd ? ;ZBufferPoint*
pr2 dd ? ;ZBufferPoint* pr2 dd ? ;ZBufferPoint*
@ -699,10 +718,34 @@ if INTERP_Z eq 1
end if end if
if INTERP_RGB eq 1 if INTERP_RGB eq 1
mov eax,[r1] mov eax,[r1]
bt eax,31 ; коректирование испорченных пикселей (в начале линии)
jnc @f
xor eax,eax
@@:
bt eax,16
jnc @f
mov eax,0xff00
@@:
mov [or1],eax mov [or1],eax
mov eax,[g1] mov eax,[g1]
bt eax,31
jnc @f
xor eax,eax
@@:
bt eax,16
jnc @f
mov eax,0xff00
@@:
mov [og1],eax mov [og1],eax
mov eax,[b1] mov eax,[b1]
bt eax,31
jnc @f
xor eax,eax
@@:
bt eax,16
jnc @f
mov eax,0xff00
@@:
mov [ob1],eax mov [ob1],eax
end if end if
if INTERP_ST eq 1 if INTERP_ST eq 1
@ -720,8 +763,13 @@ end if
align 4 align 4
.cycle_1: ;while (n>=3) .cycle_1: ;while (n>=3)
if INTERP_RGB eq 1
cmp dword[n],5
jl .cycle_2
else
cmp dword[n],3 cmp dword[n],3
jl .cycle_2 jl .cycle_2
end if
PUT_PIXEL 0 PUT_PIXEL 0
PUT_PIXEL 1 PUT_PIXEL 1
PUT_PIXEL 2 PUT_PIXEL 2
@ -733,6 +781,36 @@ end if
sub dword[n],4 sub dword[n],4
jmp .cycle_1 jmp .cycle_1
.cycle_2: ;while (n>=0) .cycle_2: ;while (n>=0)
if INTERP_RGB eq 1
; коректирование испорченных пикселей (в конце линии)
bt dword[or1],31
jnc @f
mov dword[or1],0
jmp .end_r
@@:
bt dword[or1],16
jnc .end_r
mov dword[or1],0xff00
.end_r:
bt dword[og1],31
jnc @f
mov dword[og1],0
jmp .end_g
@@:
bt dword[og1],16
jnc .end_g
mov dword[og1],0xff00
.end_g:
bt dword[ob1],31
jnc @f
mov dword[ob1],0
jmp .end_b
@@:
bt dword[ob1],16
jnc .end_b
mov dword[ob1],0xff00
.end_b:
end if
cmp dword[n],0 cmp dword[n],0
jl .cycle_2_end jl .cycle_2_end
PUT_PIXEL 0 PUT_PIXEL 0