forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Альфа канал в текстуре (http://forum.boolean.name/showthread.php?t=12993)

phoenix29 23.07.2010 18:09

Альфа канал в текстуре
 
Привет всем!

Сразу прошу прощение, если данный вопрос уже здесь неоднократно звучал и на него также неоднократно отвечали. Я находил конечно такие темы, но там альфа канал добавлялся в картинку, затем картинку загружали, например, как спрайт с альфа свойством и все было хорошо.

У меня же вот какая задача. Нужно изобразить спрайтом число, которое изменяется по ходу игры. Ну или вообще картинку, которую я сначала рисую в блитзе. Конечно, с альфа каналом. То есть я создаю спрайт, создаю текстуру, рисую на текстуре изображение, вставляю альфа канал, назначаю спрайту эту текстуру... и вот я даже не знаю, должно оно такое работать или нет? :dontknow:


Код:

score_spr=CreateSprite()
SpriteViewMode score_spr,2
ScaleSprite score_spr,150,25
PositionEntity score_spr,550,1,100
TurnEntity score_spr,90,0,0

score_spr_tex=CreateTexture(300,50,2)
SetBuffer TextureBuffer(score_spr_tex)
ClsColor 254,100,254
Cls
Color 100,250,100
SetFont rusfont
Text 0,0,"1234567890"

score_spr_tex_2=CreateTexture(300,50,2)
SetBuffer TextureBuffer(score_spr_tex_2)
ClsColor 100,100,100
Cls
Color 254,254,254
SetFont rusfont
Text 0,0,"amncjoewlmn"

SetBuffer BackBuffer()
LoadAlphaChannel(score_spr_tex,score_spr_tex_2)
EntityTexture score_spr,score_spr_tex

где функция LoadAlphaChannel:

Код:

Function LoadAlphaChannel(id,tex4)
 If tex4<>0
  If TextureWidth(id)=TextureWidth(tex4)
  If TextureHeight(id)=TextureHeight(tex4)
    SetBuffer TextureBuffer(id)
    LockBuffer(TextureBuffer(tex4))
    LockBuffer(TextureBuffer(id))
    For j=0 To TextureHeight(tex4)-1
    For i=0 To TextureWidth(tex4)-1
      argb=ReadPixelFast(i,j,TextureBuffer(tex4)) And $ffffff
      r=(argb Shr 16)And $FF
      g=(argb Shr 8)And $FF
      b=argb And $FF
      grey= ((r+g+b)/3)
      If grey > 255 Then grey=255
      rgb=(ReadPixelFast(i,j,TextureBuffer(id))) And $FFFFFF
      WritePixelFast i,j,rgb Or (grey Shl 24),TextureBuffer(id)
    Next
    Next
    UnlockBuffer(TextureBuffer(tex4))
    UnlockBuffer(TextureBuffer(id))
    SetBuffer BackBuffer()
  EndIf
  EndIf
  FreeTexture tex4
 EndIf
End Function

В результате появляется полупрозрачный (Color 100,100,100) фиолетовый спрайт. Текста нету, ни в альфе ни в просто текстуре. Объясните пожалуйста почему так и где ошибки. Если это не так делается, то расскажите, как?

ABTOMAT 23.07.2010 21:29

Ответ: Альфа канал в текстуре
 
Насколько я помню, в блице писать в альфаканал текстуры нельзя (поправьте, если не так)
Так что я бы сделал так:
На чёрном фоне писать светлым цветом.
Потом применять EntityBlend 3
Получится светящийся прозрачный текст. (я надеюсь, это поможет)
Если нет, можно маской делать, но там края рваные будут (и на память не скажу как производить шаманство, но мы с Лейто так делали в Танчиках)

phoenix29 23.07.2010 23:33

Ответ: Альфа канал в текстуре
 
Цитата:

Так что я бы сделал так:
На чёрном фоне писать светлым цветом.
Потом применять EntityBlend 3
Получится светящийся прозрачный текст. (я надеюсь, это поможет)
Помогло :super: . Эх, я ж сам смотрел блендинг режимы, мог бы сам додуматься, да пока дурак :-) . Спасибо большое, АВТОМАТ! :)

ABTOMAT 24.07.2010 13:30

Ответ: Альфа канал в текстуре
 
Цитата:

Сообщение от phoenix29 (Сообщение 156035)
Помогло :super: . Эх, я ж сам смотрел блендинг режимы, мог бы сам додуматься, да пока дурак :-) . Спасибо большое, АВТОМАТ! :)

Адекватному вопросу - адекватный ответ :super:


Часовой пояс GMT +4, время: 18:58.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot