Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: Табличка всех вариантов пикселей и аттрибутов

  1. #1

    Red face Табличка всех вариантов пикселей и аттрибутов

    Пытаюсь составить табличку всех вариантов пикселей и аттрибутов.
    Получается же 65536 комбинаций? По 4 байта на пиксель. Итого 256 кб табличка.
    Но что то не ладится.

    PHP код:

      
    For pixels.0 To 255
        
    For attr.0 To 255
          
          Paper 
    = (attr >> 3) & $0F 
          ink   
    = (attr 7)  | ((attr 64) >> 3)
          
          
    bit 128
          
    For 0 To 7
            
            
    If pixels bit
              
              color
    .colorink )
              
            Else  
              
              
    color colorpaper )
              
            EndIf
            
            
    color.$FF000000 Red(color) << 16 Green(color) << Blue(color)
            
    PokeL(attributes_table + (((pixels << 8) | attr )<<2), color )
                            
            
    bit >> 1
          Next z 
                
        Next attr
        
      Next pixels 

    color
    (0)  =   |   << 0   << 16 
    color
    (1)  =   |   << 180 << 16 
    color
    (2)  = 180 |   << 0   << 16
    color
    (3)  = 180 |   << 180 << 16 
    color
    (4)  =   178 << 0   << 16 
    color
    (5)  =   178 << 180 << 16
    color
    (6)  = 180 178 << 0   << 16 
    color
    (7)  = 180 178 << 180 << 16 

    color
    (8)  =   |   << 0   << 16 
    color
    (9)  =   |   << 252 << 16 
    color
    (10) = 252 |   << 0   << 16 
    color
    (11) = 252 |   << 252 << 16 
    color
    (12) =   254 << 0   << 16 
    color
    (13) =   254 << 252 << 16 
    color
    (14) = 252 254 << 0   << 16 
    color
    (15) = 252 254 << 252 << 16 
    Для начала не могу уловить есть ли разница в какой байт класть пикселы, а в какой атрибуты.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    9,713
    Благодарностей: 3305

    По умолчанию

    Боюсь, что плохо сформулировано, что ты хочешь, зачем и почему.
    А так же, что у тебя не так получается относительно того, чего бы ты хотел)

  4. #3

    По умолчанию

    Интересный вриант - http://www.yoyogames.com/blog/89
    память спектрума грузится в текстуру и из нее уже рисуется на экран.
    Но пока хотелось бы вариант попроще.

    - - - Добавлено - - -

    Еще немного ускорил:

    PHP код:

      
    For adr.0 To 6143*4 Step 4
        
        chr_pixels
    .l   =  PeekA(*mem PeekL(pixels_adress_table adr) )
        
    chr_attr.l     =  PeekA(*mem PeekL(attributes_adress_table adr)  ) 
        
        
    CopyMemoryattributes_table + ((((chr_pixels&128) << 8) | (chr_attr))<<2), texture):texture 4
        CopyMemory
    attributes_table + ((((chr_pixels&64 ) << 8) | (chr_attr))<<2), texture):texture 4
        CopyMemory
    attributes_table + ((((chr_pixels&32 ) << 8) | (chr_attr))<<2), texture):texture 4
        CopyMemory
    attributes_table + ((((chr_pixels&16 ) << 8) | (chr_attr))<<2), texture):texture 4
        CopyMemory
    attributes_table + ((((chr_pixels&8  ) << 8) | (chr_attr))<<2), texture):texture 4
        CopyMemory
    attributes_table + ((((chr_pixels&4  ) << 8) | (chr_attr))<<2), texture):texture 4
        CopyMemory
    attributes_table + ((((chr_pixels&2  ) << 8) | (chr_attr))<<2), texture):texture 4
        CopyMemory
    attributes_table + ((((chr_pixels&1  ) << 8) | (chr_attr))<<2), texture):texture 4
        
      Next adr 
    Последний раз редактировалось newart; 30.09.2016 в 02:34.

  5. #4
    Master
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    510
    Благодарностей: 245

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    Получается же 65536 комбинаций? По 4 байта на пиксель. Итого 256 кб табличка.
    65536 комбинаций. По 8 пикселей в комбинации. По 4 байта на пиксель. Итого 2Мб табличка.
    Последний раз редактировалось Reobne; 02.10.2016 в 19:26.

  6. #5
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    76
    Благодарностей: 35

    По умолчанию

    Зачем только сразу делать по 32 бита на точку? Чем плохо 16 цветов с палитрой? Можно сразу вычислять по 8 точек пользуясь 1(только для pixels) или 3(еще для paper и delta) таблицами на 256 элементов и это будет быстрее чем копировать по 32 байта. В таблице mask каждый бит индекса просто дублируется по 4 раза, то есть если на входе 011000100b, в ячейке должна лежать маска 0FF000F00h.
    PHP код:
    uint32 Paper = ((attr >> 3) & $0F )*$11111111
    uint32 delta  
    = ((attr&7) ^ (attr >> 3) & $0F )*$11111111
    result
    =paper^(delta&mask[pixels]) 

  7. #6

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Зачем только сразу делать по 32 бита на точку?
    Потому что такой формат текстуры выбран в OpenGL. (по привычке)
    Сейчас погуглил, для спектрума можно наверное и GL_R3_G3_B2 обойтись.

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Можно сразу вычислять по 8 точек пользуясь 1(только для pixels) или 3(еще для paper и delta) таблицами на 256 элементов и это будет быстрее чем копировать по 32 байта. В таблице mask каждый бит индекса просто дублируется по 4 раза, то есть если на входе 011000100b, в ячейке должна лежать маска 0FF000F00h.
    Ничего не понял )

  8. #7
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    76
    Благодарностей: 35

    По умолчанию

    newart, чтобы выполнить преобразование нужно из атрибутов вычислить какого цвета должен быть paper, вычислить какого цвета ink, сделать xor между paper и ink чтобы получить delta. Далее все 8 точек красим в цвет paper (delta тоже копируется в 8 точек, или можно и то и другое сразу вытащить из таблицы), из таблицы на 256 элементов вытаскиваем маску для точек которые нужно перекрасить в цвет ink, делаем побитовое and с delta и затем хоr c paper, в итоге точки которые должны быть цвета ink будут перекрашены. Если использовать GL_R3_G3_B2, значит в каждом элементе таблицы будет по 8 байт, причём в таблице масок байты будут только 00 и FF, а для других таблиц байты в пределах 1 элемента будут одинаковые.

  9. Этот пользователь поблагодарил blackmirror за это полезное сообщение:
    newart (03.10.2016)

  10. #8

    По умолчанию

    У меня получается 128 (вариантов атрибутов) * 256 значений (байт сразу) * 2 байта на пиксель (16 битный цвет) = 65536 байт.
    FLASH я делаю отдельно, инвертирую байт пикселей.

  11. #9

    По умолчанию

    На соседнем форуме один фанат ретрокомпо накатал версию под SSE2. Получилось весьма шустро. Дает на 5-10 fps больше чем мой вариан

    Вдруг кому пригодится:

    PHP код:

    ZXScreen module by Wilbert

    ; *SCR has to be 6912 bytes of ZX Spectrum screen
    ; *Target has to be a buffer for 32 bit color data
    When FlashState is set to 1pen and ink will be
    switched for blocks that have the flash bit set.

    DeclareModule ZXScreen
      
      
    Declare RenderSCR(*SCR, *TargetFlashState 0)
      
    EndDeclareModule

    Module ZXScreen
      
      
    #FlipY = #True
      #SwapRB = #True
      
      
    EnableExplicit
      DisableDebugger           
    disabling debugger is required !!
      
    EnableASM
      
      
    ;- Data section
      
      DataSection
        ColorLUT
    :
        
    Data.l $ff000000,$ffc03020,$ff1040c0,$ffc040c0,$ff10b040,$ffb0c050,$ff10c0e0,$ffc0c0c0
        Data
    .l $ff000000,$ffff4030,$ff3040ff,$fff070ff,$ff10e050,$ffffe050,$ff50e8ff,$ffffffff
      EndDataSection
        
      
    ;- Structures
      
      Structure RenderLUT
        bit_expand
    .l[256 8]   ; offset 0
        color
    .l[256 2]        ; offset 8192
        offset
    .u[768]           ; offset 10240
      EndStructure  
      
      
    ;- Global variables
      
      
    Global *Mem, *RenderLUT.RenderLUT
      
      
    ;- Init lookup table
      
      Procedure SwapRB
    (color.l)
        !
    mov eax, [p.v_color]
        !
    bswap eax
        
    !ror eax8
        ProcedureReturn
      EndProcedure
        
      Procedure InitTable
    ()
        Protected.
    i bitcoliinkpaperrow
        
    If Not *RenderLUT
          
    *Mem AllocateMemory(SizeOf(RenderLUT) + 32)
          *
    RenderLUT.RenderLUT = (*Mem 31) & -32
          
    For 0 To 255
            
    If & $80
              ink 
    = (>> 15) : paper = (>> 8) | (7)  ; flash
            
    Else
              
    paper = (>> 15) : ink = (>> 8) | (7)  ; normal
            
    EndIf
            
    CompilerIf #SwapRB
              
    *RenderLUT\color[<< 1    ] = SwapRB(PeekL(?ColorLUT paper << 2))
              *
    RenderLUT\color[<< 1] = SwapRB(PeekL(?ColorLUT ink   << 2))
            
    CompilerElse
              
    *RenderLUT\color[<< 1    ] = PeekL(?ColorLUT paper << 2)  ; paper
              
    *RenderLUT\color[<< 1] = PeekL(?ColorLUT ink   << 2)  ; ink
            CompilerEndIf
          Next  
          
    For row 0 To 7
            
    For col 0 To 31
              
    *RenderLUT\offset[row << col] = row << col
              
    *RenderLUT\offset[row << col 256] = row << col 2048
              
    *RenderLUT\offset[row << col 512] = row << col 4096
            Next
          Next
          
    For 0 To 255
            
    For bit 0 To 7
              
    If & ($80 >> bit)
                *
    RenderLUT\bit_expand[<< bit] = -1
              
    EndIf
            
    Next
          Next
        
    EndIf
      
    EndProcedure
      
      InitTable
    ()
      
      ;- 
    Main code
      
      CompilerIf 
    #PB_Compiler_Processor = #PB_Processor_x86
        
    Macro rax eax EndMacro
        Macro rbx 
    ebx EndMacro
        Macro rcx 
    ecx EndMacro
        Macro rdx 
    edx EndMacro
        Macro rsi 
    esi EndMacro
        Macro rdi 
    edi EndMacro
        Macro rsp 
    esp EndMacro
      CompilerEndIf
      
      Macro M_8x1
    (line)
        !
    movzx eaxbyte [rsi rbx line*256] ; get bits
        
    !shl eax5
        
    !movdqa xmm0, [rdx    rax]            ; expand every bit to 32 bits 
        
    !movdqa xmm1, [rdx+16 rax]            ; expand every bit to 32 bits 
        
    !pand xmm0xmm3
        
    !pand xmm1xmm3
        
    !pxor xmm0xmm2
        
    !pxor xmm1xmm2
        CompilerIf 
    #FlipY
          
    !movdqu [rdi    + (7-line)*1024], xmm0
          
    !movdqu [rdi+16 + (7-line)*1024], xmm1
        CompilerElse
          
    !movdqu [rdi    line*1024], xmm0
          
    !movdqu [rdi+16 line*1024], xmm1     
        CompilerEndIf
      EndMacro
      
      Procedure RenderSCR
    (*SCR, *TargetFlashState 0)
        
    FlashState = (FlashState << 7) ! $7f
        
    backup registers without push
        
    so references to local variables stay valid
        mov 
    [rsp -  8], rbx
        mov 
    [rsp 16], rsi
        mov 
    [rsp 24], rdi
        
    load registers
        mov rdx
    , *RenderLUT
        mov rsi
    , *SCR
        mov rdi
    , *Target
        CompilerIf 
    #FlipY
          
    add rdi188416
        CompilerEndIf    
        
    block loop
        
    !xor ecxecx                           ecx counter (767)
        !.
    block_loop:
        
    movzx eaxbyte [rsi+6144 rcx]        ; get attributes of block
        
    !and eax, [p.v_FlashState]
        
    movq xmm0, [rdx+8192 rax*8]
        !
    pshufd xmm2xmm000000000b           paper
        
    !pshufd xmm3xmm001010101b           ink
        
    !pxor xmm3xmm2
        movzx ebx
    word [rdx+10240 rcx*2]     ; get block offset
        M_8x1
    (0)                                ; block line 0
        M_8x1
    (1)                                ; block line 1
        M_8x1
    (2)                                ; block line 2
        M_8x1
    (3)                                ; block line 3
        M_8x1
    (4)                                ; block line 4
        M_8x1
    (5)                                ; block line 5
        M_8x1
    (6)                                ; block line 6
        M_8x1
    (7)                                ; block line 7
        add rdi
    32
        
    !inc ecx
        
    !test ecx31                           ; new row check
        
    !jnz .block_loop
        CompilerIf 
    #FlipY
          
    sub rdi9216
        CompilerElse
          add rdi
    7168
        CompilerEndIf
        
    !cmp ecx768
        
    !jne .block_loop
        
    restore registers
        mov rdi
    , [rsp 24]
        
    mov rsi, [rsp 16]
        
    mov rbx, [rsp -  8]
      
    EndProcedure
      
    EndModule 

  12. #10
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    76
    Благодарностей: 35

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    На соседнем форуме один фанат ретрокомпо накатал версию под SSE2. Получилось весьма шустро. Дает на 5-10 fps больше чем мой вариан
    Только у него 2Мб таблиц нету, ему хватает таблиц по 256 элементов - отдельно для точек и отдельно для атрибутов.

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 1
    Последнее: 19.01.2011, 23:05
  2. Всех с 8 марта!
    от Максагор в разделе Поздравления
    Ответов: 8
    Последнее: 12.03.2009, 03:28
  3. Ремонт одного из вариантов "Ленинград-1"
    от Chokki в разделе Ленинград
    Ответов: 18
    Последнее: 10.02.2009, 01:46

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •