Подскажите, чего не хватает для отображения текстуры? (или мешает)

Тема в разделе "WASM.OpenGL", создана пользователем Dmitry_Milk, 14 июн 2011.

  1. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Решил заняться самообразованием в области OpenGL. На opengl.org почитал спецификацию, взялся за Red Book и решил параллельно устроить себе типа курса лабораторных работ, правда примеры не прямо из редбука, а взял заготовку простейшего оконного Win32 приложения на асме и начал экспериментировать в нем, постепенно добавляя изучаемые в редбуке фичи в прогу.

    Получение OpenGL-контекста, примитивы, цвета, матричные преобразования, материалы, освещение, блендинг, битмапы и имиджи прошли нормально. Споткнулся на текстурах. Упорно не хочет отображаться. Стал проверять glGetError после каждой относящейся к текстурированию команды - нет ошибок. Прочитал через glGetTexImage уже загруженную текстуру в другой массив в другом формате (специально, чтоб не сработало как просто тупое копирование) и отобразил прочитанное через glDrawPixels - отобразилось правильно, значит текстура загрузилась.

    Как ни бьюсь - рисуется подсвещенный белый прямоугольник без каких-либо признаков текстурирования. Пробовал выключать блендинг, освещение - не помогает. Третий день бьюсь. Больше идей нет. :dntknw:

    Подскажите, в каком месте у меня в ДНК ошибка? ;)

    Инициализационная часть (сразу после получения контекста):
    Код (Text):
    1.     invoke  glEnable,GL_NORMALIZE
    2.     invoke  glEnable,GL_DEPTH_TEST
    3.     invoke  glDepthFunc,GL_LEQUAL
    4.     invoke  glEnable,GL_BLEND
    5.     invoke  glBlendFunc,GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA
    6.     invoke  glEnable,GL_LIGHTING
    7.     invoke  glLightModeli,GL_LIGHT_MODEL_TWO_SIDE,TRUE
    8.     invoke  glLightModeli,GL_LIGHT_MODEL_LOCAL_VIEWER,TRUE
    9.  
    10.     invoke  glMatrixMode,GL_PROJECTION
    11.     invoke  glLoadIdentity
    12.     invoke  glFrustum,DWORD PTR frustLeft,DWORD PTR frustLeft+4,DWORD PTR frustRight,DWORD PTR frustRight+4,DWORD PTR frustBottom,DWORD PTR frustBottom+4,DWORD PTR frustTop,DWORD PTR frustTop+4,DWORD PTR frustNear,DWORD PTR frustNear+4,DWORD PTR frustFar,DWORD PTR frustFar+4
    13.     invoke  glMatrixMode,GL_MODELVIEW
    14.     invoke  glLoadIdentity
    Загрузка и настройка текстуры:
    Код (Text):
    1.     invoke  glPixelStorei,GL_UNPACK_ALIGNMENT,1
    2.     invoke  glTexImage2D,GL_TEXTURE_2D,0,3,64,64,0,GL_RGB,GL_UNSIGNED_BYTE,ADDR testTexture
    3.     invoke  glTexParameteri,GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT
    4.     invoke  glTexParameteri,GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT
    5.     invoke  glTexParameteri,GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST
    6.     invoke  glTexParameteri,GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST
    7.     invoke  glTexEnvf,GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL
    8.     invoke  glShadeModel,GL_SMOOTH
    Кусок функции рисования (рисующий примитив, на который хочу натянуть текстуру):
    Код (Text):
    1.         invoke  glMaterialfv,GL_FRONT_AND_BACK,GL_SPECULAR,ADDR whiteColor
    2.         invoke  glMaterialfv,GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,ADDR whiteColor
    3.         invoke  glNormal3f,0,0,flt1
    4.         invoke  glEnable,GL_TEXTURE_2D
    5.         invoke  glBegin,GL_QUADS
    6.             invoke  glTexCoord2f,0,0
    7.             invoke  glVertex3fv,ADDR whtSheetP1
    8.             invoke  glTexCoord2f,flt1,0
    9.             invoke  glVertex3fv,ADDR whtSheetP2
    10.             invoke  glTexCoord2f,flt1,flt1
    11.             invoke  glVertex3fv,ADDR whtSheetP3
    12.             invoke  glTexCoord2f,0,flt1
    13.             invoke  glVertex3fv,ADDR whtSheetP4
    14.         invoke  glEnd
    15.         invoke  glFlush
    16.         invoke  glDisable,GL_TEXTURE_2D
    здесь flt1 dd 1.0
     
  2. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Простота результата не означает простоты решения!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    КТО ВАМ СКАЗАЛ, что огл будет угадывать ваши желания?
    Графику нужно грузить в память самостоятельно. Ну в крайнем случае либами.
    Код (Text):
    1. ifndef          _BMP_ASM
    2. _BMP_ASM        equ 1
    3.  
    4. ; ------------------------------------------------------
    5. ; Includes
    6.             include Files.asm
    7.  
    8. ; ------------------------------------------------------
    9. ; Structures
    10. BMP         struct
    11. _Datas          dword   ?
    12. _Width          dword   ?
    13. _Height         dword   ?
    14. _Bits           dword   ?
    15. BMP         ends
    16.  
    17. ; ------------------------------------------------------
    18. ; Name: Load_BMP
    19. ; Desc: Load a 24 or 32 bits BMP file into memory
    20. Load_BMP        proc    uses ebx esi edi BMP_FName:dword, BMP_Struct:dword, Color_Key:dword
    21.             local   BMP_Buffer:dword
    22.             local   FSize:dword
    23.             local   DatOffset:dword
    24.             local   _Modulo:dword
    25.             local   _Width:dword
    26.             local   _Height:dword
    27.  
    28.             mov esi, BMP_Struct
    29.             mov [esi + BMP._Datas], NULL
    30.  
    31.             ; Load texture into memory
    32.             invoke  Load_File, BMP_FName, addr FSize
    33.             test    eax, eax
    34.             jz  Err_BMP_Load
    35.             mov BMP_Buffer, eax
    36.  
    37.             ; Decode the BMP file
    38.             mov ebx, eax
    39.             mov edi, eax
    40.             mov ax, "MB"
    41.             cmp word ptr [edi + BITMAPFILEHEADER.bfType], ax
    42.             jne Err_BMP_Format
    43.             mov eax, FSize
    44.             cmp dword ptr [edi + BITMAPFILEHEADER.bfSize], eax
    45.             jne Err_BMP_Format
    46.  
    47.             mov DatOffset, CMEM([edi + BITMAPFILEHEADER.bfOffBits])
    48.             lea edi, [edi + sizeof BITMAPFILEHEADER]
    49.  
    50.             mov eax, dword ptr [edi + BITMAPINFOHEADER.biWidth]
    51.             test    eax, eax
    52.             js  Err_BMP_Format
    53.             jz  Err_BMP_Format
    54.             ; Fix the raster lines stuff
    55.             mov [esi + BMP._Width], eax
    56.             mov _Width, eax
    57.             imul    eax, 3
    58.             cdq
    59.             mov ecx, 4
    60.             idiv    ecx
    61.             xchg    edx, eax
    62.             mov _Modulo, 0
    63.             .if eax != 0
    64.                 sub ecx, eax
    65.                 mov _Modulo, ecx
    66.             .endif
    67.             movzx   eax, word ptr [edi + BITMAPINFOHEADER.biHeight]
    68.             test    eax, eax
    69.             js  Err_BMP_Format
    70.             jz  Err_BMP_Format
    71.             mov [esi + BMP._Height], eax
    72.             mov _Height, eax
    73.  
    74.             movzx   eax, word ptr [edi + BITMAPINFOHEADER.biBitCount]
    75.             mov [esi + BMP._Bits], eax
    76.             cmp eax, 24                 ; Must be 24 bits (bottom left)
    77.             je  GoodTextureFormat
    78.             cmp eax, 32                 ; or 32 bits
    79.             je  GoodTextureFormat
    80. Err_BMP_Format:     FREEMEM BMP_Buffer
    81. Err_BMP_Load:       xor eax, eax                ; Not loaded
    82.             ret
    83. GoodTextureFormat:  mov eax, [esi + BMP._Width]
    84.             imul    eax, [esi + BMP._Height]
    85.             push    eax
    86.             shl eax, 2
    87.             mov eax, ALLOCMEM(eax)
    88.             pop ecx
    89.             test    eax, eax
    90.             jz  Err_BMP_Format
    91.             mov [esi + BMP._Datas], eax
    92.             mov edi, eax
    93.             mov eax, DatOffset
    94.             .if [esi + BMP._Bits] == 32
    95.                 lea esi, [ebx + eax]        ; 24 bits image datas
    96.                 mov ecx, _Height
    97. Loop_32Bits_Y:          push    ecx
    98.                 mov ecx, _Width
    99. Loop_32Bits_X:          lodsb
    100.                 ror eax, 8
    101.                 lodsb
    102.                 ror eax, 8
    103.                 lodsb
    104.                 ror eax, 8
    105.                 lodsb
    106.                 bswap   eax
    107.                 and eax, 000ffffffh
    108.                 mov edx, Color_Key
    109.                 test    edx, edx
    110.                 js  _No_Set_Alpha_32
    111.                 and edx, 000ffffffh
    112.                 cmp edx, eax
    113.                 jne _No_Set_Alpha_32
    114.                 mov eax, 0ff000000h         ; Turn alpha channel on for this color
    115. _No_Set_Alpha_32:       xor eax, 0ff000000h
    116.                 stosd
    117.                 loop    Loop_32Bits_X
    118.                 pop ecx
    119.                 loop    Loop_32Bits_Y
    120.             .else
    121.                 lea esi, [ebx + eax]        ; 24 bits image datas
    122.                 mov ecx, _Height
    123. Loop_24Bits_Y:          push    ecx
    124.                 mov ecx, _Width
    125. Loop_24Bits_X:          or  eax, -1
    126.                 lodsb
    127.                 shl eax, 8
    128.                 lodsb
    129.                 shl eax, 8
    130.                 lodsb
    131.                 and eax, 000ffffffh
    132.                 mov edx, Color_Key
    133.                 test    edx, edx
    134.                 js  _No_Set_Alpha_24
    135.                 and edx, 000ffffffh
    136.                 cmp edx, eax
    137.                 jne _No_Set_Alpha_24
    138.                 mov eax, 0ff000000h         ; Turn alpha channel on for this color
    139. _No_Set_Alpha_24:       xor eax, 0ff000000h
    140.                 stosd
    141.                 loop    Loop_24Bits_X
    142.                 add esi, _Modulo
    143.                 pop ecx
    144.                 loop    Loop_24Bits_Y
    145.             .endif
    146.             FREEMEM BMP_Buffer
    147.             mov eax, TRUE               ; Loaded
    148.             ret
    149. Load_BMP        endp
    150.  
    151. ; ------------------------------------------------------
    152. ; Name: Unload_BMP
    153. ; Desc: Free an allocated BMP picture
    154. Unload_BMP      proc    uses esi BMP_Struct:dword
    155.             mov esi, BMP_Struct
    156.             test    esi, esi
    157.             jz  @F
    158.             mov eax, [esi + BMP._Datas]
    159.             test    eax, eax
    160.             jz  @F
    161.             FREEMEM eax
    162. @@:         ret
    163. Unload_BMP      endp
    164.  
    165. endif
    Это часть исходников Франка Чарлета
    (Franck Charlet)
    Качайте с WASM-а и будет вам счастье.
     
  3. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Если Вы про заполнение того массива данных, который я подставляю в glTexImage2D для загрузки текстуры, то конечно же я его заполнил. Просто здесь не показал. Правда заполнял я его не из BMP или какого-либо другого файла, а просто пока для примера руками нарисовал в нем шахматную доску, поскольку формат вполне простой и понятный - GL_RGB,GL_UNSIGNED_BYTE - подряд по три байта для каждого тексела, построчно тексел за текселом, выравнивание строк побайтное, так что без всяких пропусков.

    И если верить вызываемым после glTexImage2D для проверки функциям glGetTexImage и glDrawPixels - эта шахматная доска занеслась в качестве текстуры успешно, поскольку прочитанная в другой буфер И В ДРУГОМ ФОРМАТЕ (четырехбайтовый GL_RGBA), она на экране (как результат glDrawPixels) отобразилась правильно.

    Собственно, именно так и в примере в редбуке сделано - шахматная доска, сформированная вручную.
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Попробуйте закомментировать
    Код (Text):
    1. ;В части инициализации
    2. ;    invoke    glEnable,GL_NORMALIZE
    3. ;    invoke    glEnable,GL_DEPTH_TEST
    4. ;    invoke    glDepthFunc,GL_LEQUAL
    5. ;    invoke    glEnable,GL_BLEND
    6. ;    invoke    glBlendFunc,GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA
    7. ;    invoke    glEnable,GL_LIGHTING
    8. ;    invoke    glLightModeli,GL_LIGHT_MODEL_TWO_SIDE,TRUE
    9. ;    invoke    glLightModeli,GL_LIGHT_MODEL_LOCAL_VIEWER,TRUE
    10. ;    invoke    glFrustum,DWORD PTR frustLeft,DWORD PTR frustLeft+4,DWORD PTR frustRight,DWORD PTR frustRight+4,DWORD PTR frustBottom,DWORD PTR frustBottom+4,DWORD PTR frustTop,DWORD PTR frustTop+4,DWORD PTR frustNear,DWORD PTR frustNear+4,DWORD PTR frustFar,DWORD PTR frustFar+4
    11. ;    invoke    glLoadIdentity
    12.  
    13. ;В части отрисовки:
    14. ;        invoke    glMaterialfv,GL_FRONT_AND_BACK,GL_SPECULAR,ADDR whiteColor
    15. ;        invoke    glMaterialfv,GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,ADDR whiteColor
    16. ;        invoke glNormal3f,0,0,flt1
    Естественно, при этом поправьте координаты вертексов, чтоб на экран влезали. Что-то подсказывает, что либо текстура выводится, но не тем размером, каким хотелось бы, либо ее из-за лайтинга/блендинга "засвечивает", либо с нормалями чего-то не то (кстати, в оригинале из RedBook нормалей нет).

    А вообще, давайте весь исходник! Вместе с генерацией текстуры, и вообще, чтоб можно было в компилятор сунуть.
     
  5. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Вот, вообще все лишнее убрал, только окно, один прямоугольник и текстура.

    Справа сверху от прямоугольника - просто вывод прочитанного обратно из текстуры для проверки того, что картинка текстуры правильно создана и загрузилась. Сам прямоугольник по прежнему остается белым, хотя вроде должен быть текстурированным.
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Волшебство таилось вот тут:

    Код (Text):
    1.     invoke  glTexEnvi,GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL
    вместо glTexEnvf.

    Нет, это не опечатка, полагаю, в RedBook - просто С++ нормально преобразует константу к плавающему виду. Ну а нам, кабанам... в данном случае интегеры самое оно.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    FatMoon

    Скорее таки опечатка. glTexEnvf нужен для установки флоатного параметра. А енам-параметры все ставят через glTexEnvi. То, что токен из флоата преобразовался в инт, и во внутрях подошел под нужный кейс - это конечно работает, но это удаление гланд в кабинете проктолога.
     
  8. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    FatMoon, А, ГЕНИЙ!!

    Блин, а ведь в одном месте я уже на подобное наступил, тоже было f вместо i и целочисленная константа, автоматически преобразовывавшаяся в СИ, но конечно же неизменная в асме. Но там нашлось через glGetError, а тут glGetError сказал, что все ОК, сцука такой :-?

    FatMoon, огромное спасибо! :) Тема исчерпана.
     
  9. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    К сожалению проктологом оказался автор официального редбука :dntknw:, на который официальная ссылка c официального сайта opengl.org. У него и в других местах такие же вещи есть, только там мне glGetError подсказал, где нечисто, а тут промолчал, ну а я по природной невнимательности не заметил :-/