From 9780bc0c05e2412aef52b3c2066c62d2aea101a5 Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 19 Nov 2015 23:28:22 +0000 Subject: [PATCH] fix interpolated pixels colors git-svn-id: svn://kolibrios.org@5922 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/TinyGL/asm_fork/light.asm | 3 + .../libraries/TinyGL/asm_fork/ztriangle.asm | 12 +-- .../libraries/TinyGL/asm_fork/ztriangle.inc | 78 +++++++++++++++++++ 3 files changed, 88 insertions(+), 5 deletions(-) diff --git a/programs/develop/libraries/TinyGL/asm_fork/light.asm b/programs/develop/libraries/TinyGL/asm_fork/light.asm index 9cb5e5c6b3..b6e39e1481 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/light.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/light.asm @@ -216,16 +216,19 @@ pushad jmp .end_f .end_spot_c: cmp ecx,GL_CONSTANT_ATTENUATION + jne @f mov ecx,[ebx+12] mov [edi+offs_ligh_attenuation],ecx ;l->attenuation[0]=p[3] jmp .end_f @@: cmp ecx,GL_LINEAR_ATTENUATION + jne @f mov ecx,[ebx+12] mov [edi+offs_ligh_attenuation+4],ecx ;l->attenuation[1]=p[3] jmp .end_f @@: cmp ecx,GL_QUADRATIC_ATTENUATION + jne @f mov ecx,[ebx+12] mov [edi+offs_ligh_attenuation+8],ecx ;l->attenuation[2]=p[3] jmp .end_f diff --git a/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm b/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm index 27d7de4691..5fe7f53d51 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm @@ -82,10 +82,9 @@ local .end_0 ;edi = pp mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение if TGL_FEATURE_RENDER_BITS eq 24 + mov ecx,[og1] mov eax,[or1] mov cl,ah - mov eax,[og1] - mov ch,ah mov word[edi+3*_a],cx mov eax,[ob1] mov byte[edi+3*_a +2],ah @@ -200,7 +199,8 @@ local .end_0 mov ebx,[pz] cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) jl .end_0 -; pz[_a]=zz; + ;edi = pp + mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение if TGL_FEATURE_RENDER_BITS eq 24 ; unsigned char *ptr; ; ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3; @@ -258,7 +258,8 @@ local .end_0 mov ebx,[pz] cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) jl .end_0 -; pz[_a]=zz; + ;edi = pp + mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение if TGL_FEATURE_RENDER_BITS eq 24 ; unsigned char *ptr; ; ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3; @@ -388,7 +389,8 @@ local .end_0 mov ebx,[pz] cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) jl .end_0 -; pz[_a]=zz; + ;edi = pp + mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение fild dword[z] fld dword[s_z] fdiv st0,st1 diff --git a/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc b/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc index 8b1d6987e6..e8ffc08835 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc +++ b/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc @@ -1,6 +1,25 @@ ; ; 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* pr1 dd ? ;ZBufferPoint* pr2 dd ? ;ZBufferPoint* @@ -699,10 +718,34 @@ if INTERP_Z eq 1 end if if INTERP_RGB eq 1 mov eax,[r1] + bt eax,31 ; коректирование испорченных пикселей (в начале линии) + jnc @f + xor eax,eax + @@: + bt eax,16 + jnc @f + mov eax,0xff00 + @@: mov [or1],eax mov eax,[g1] + bt eax,31 + jnc @f + xor eax,eax + @@: + bt eax,16 + jnc @f + mov eax,0xff00 + @@: mov [og1],eax mov eax,[b1] + bt eax,31 + jnc @f + xor eax,eax + @@: + bt eax,16 + jnc @f + mov eax,0xff00 + @@: mov [ob1],eax end if if INTERP_ST eq 1 @@ -720,8 +763,13 @@ end if align 4 .cycle_1: ;while (n>=3) +if INTERP_RGB eq 1 + cmp dword[n],5 + jl .cycle_2 +else cmp dword[n],3 jl .cycle_2 +end if PUT_PIXEL 0 PUT_PIXEL 1 PUT_PIXEL 2 @@ -733,6 +781,36 @@ end if sub dword[n],4 jmp .cycle_1 .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 jl .cycle_2_end PUT_PIXEL 0