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=2143)

GoodWin 19.12.2006 15:04

помогите!!!!
 
Привет!
Есть две задачи, разрешить их сам не могу, помогите советом, примером:

1 Есть текстура 512х512 - как мне в реальном времени в нужном месте делать прозрачную область?…
2 Есть текстура 512х512, есть изображение 128х128 – как в реальном времени отрисовать на текстуре изображение в нужном мне месте?…
вот….
заранее спасибо….

Platon 19.12.2006 17:17

Re: помогите!!!!
 
1)
WritePixel (WritePixelFast) и текстурный флаг 2 тебе помогут:
Текстуре ставишь флаг 2 - альфа(прозрачность)
Пишешь в нужную область текстуры пиксели с прозрачностью 0
WritePixel(X, Y, $00000000, TextureBuffer(Текстура))
Пример
Код:

Function AlphaRect(Tex, X, Y, Width, Height)
        LockBuffer(TextureBuffer(Tex))
        For Px = X To (X + Width)
                For Py = Y To (Y + Height)
                        WritePixelFast(Px, Py, $00000000, TextureBuffer(Tex))
                Next
        Next
        UnlockBuffer(TextureBuffer(Tex))
End Function

Graphics3D(640, 480, 16, 2)
SetBuffer(BackBuffer())

BackGround = CreateCube()
ScaleEntity(BackGround, 100, 100, 1)
PositionEntity(BackGround, 0, 0, 20)

Cube = CreateCube()
PositionEntity(Cube, 0, 0, 10)

cam = CreateCamera()

Texture = CreateTexture(512, 512, 2)
EntityTexture(Cube, Texture)

Repeat
        TurnEntity(Cube, 0, 1, 1)

        If KeyDown(57) Then AlphaRect(Texture, Rand(462), Rand(462), 50, 50)

        RenderWorld()
        Flip()
Until KeyDown(1)
End

2)
открываешь текстурный буффер и рисуешь туда изображение
Код:

SetBuffer(TextureBuffer(Текстура))
DrawImage(Рисунок, X, Y)
SetBuffer(BackBuffer())


HolyDel 20.12.2006 03:02

Re: помогите!!!!
 
function writealpha(x,y,alpha,buff)
writepixelfast x,y,(readpixelfast(buff) and $00FFFFFF)+alpha shl 24),buff
end function
сможете оптимизировать (ускорить расчет)?
изменяет альфу пиксела (вы догадались)

GoodWin 20.12.2006 16:22

Re: помогите!!!!
 
Цитата:

Сообщение от HolyDel
function writealpha(x,y,alpha,buff)
writepixelfast x,y,(readpixelfast(buff) and $00FFFFFF)+alpha shl 24),buff
end function
сможете оптимизировать (ускорить расчет)?
изменяет альфу пиксела (вы догадались)

readpixelfast(buff) - здесь что-то не то :)
самый простой пример с использованием твоей функции можно привести, а то что-то не получается у меня

Platon 20.12.2006 17:44

Re: помогите!!!!
 
Цитата:

readpixelfast(buff) - здесь что-то не то
Конечно не-то - там недостает параметров x и y
Код:

Function ChangeAlpha(Px%, Py%, Alpha#, Buffer%)
  Local ARGB% = ReadPixelFast(Px, Py, Buffer)
  local A% = ((ARGB Shr 24) * Alpha) Shl 24
  WritePixelFast(Px, Py, A + (ARGB And $00FFFFFF), Buffer)
End Function


GoodWin 20.12.2006 22:48

Re: помогите!!!!
 
все получается, но результат не тот...
Если я текстуру не создаю, а гружу с флагом 2 - она стоновится полупрозачной.... мне же для результата необходимо нормально отображаемую текстуру а на ней прозрачная область, которую нужно перемещать в реальном времени...

Diplomat 20.12.2006 23:03

Re: помогите!!!!
 
Да, каникулы в школах- воистину страшное время года...

2 GoodWin: Подсказываю. Слово "мультитекстурирование".

HolyDel 21.12.2006 02:53

Re: помогите!!!!
 
извиняйте, писал в браузере (да вы догадались наверное).
2 Cyan, мне не кажется этот вариант самым быстрым.
2 GoodWin, а как насчет того, чтоб каждому пикселю текстуры задать альфу $FF?.
опять пишу в браузере, опять хз
buff=texturebuffer(tex)
w=BufferWidth(buff)
h=BufferHeight(buff)
lockbuffer buff
for i=1 to w
for j=1 to h
writepixelfast i,j,readpixelfast(i,j,buff) or $FF000000
next
next
Unlockbuffer buff

Platon 21.12.2006 05:20

Re: помогите!!!!
 
Цитата:

2 Cyan, мне не кажется этот вариант самым быстрым.
А этот вариант не есть быстрый. Он есть удобный :)
Да и скорость тут целиком зависит от самой функции чтения\записи пикселя - битовые сдвиги и логические операции почти не влияют на скорость выполнения (3-5 тактов всего)

HolyDel 22.12.2006 01:24

Re: помогите!!!!
 
пожалуй ты прав, +/- 3 такта за проход погоды не сделают, все равно чтение запись намного дольше.


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

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