forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   CreateTexture (http://forum.boolean.name/showthread.php?t=6279)

MiXaeL 25.08.2008 03:46

CreateTexture
 
Сегодня вдруг выяснил такую неприятную вещь: при создании текстуры напрямую в блитце возникает странный баг с флагами. Можно поставить 2 или 4, а толку ноль - черный цвет остается просто черным.
У меня есть только одна идея по этому поводу. Справка пишет, что для альфа текстур при загрузке по умолчанию используется альфа-канал изображения. И только если его нет используется стандартная схема - чем темнее, тем прозрачнее. Возможно поэтому при создании текстуры черный цвет не делается прозрачным.
Вопрос, собственно, такой: можно ли это как-то обойти или придется геморроиться с WritePixelFast?

ABTOMAT 25.08.2008 03:54

Ответ: CreateTexture
 
При помощи WritePixel[Fast] пиши не только цвет, но и альфу. (нужна видимая точка - 255, невидимая - 0) то есть типа такого ЕСЛИ пиксель чёрный или около того, ТОГДА пишем вместе с цветом ещё и альфу 0, ИНАЧЕ - 255
З.Ы. Там нада это в 16-ричную сис. сч. перевести но это не сложно, сам же пользовался.
З.З.Ы. Не юзай WritePixelFast и ReadPixelFast, они не на всех компах работают без глюков, лучше делай обычные WritePixel и ReadPixel.

impersonalis 25.08.2008 14:47

Ответ: CreateTexture
 
Цитата:

З.З.Ы. Не юзай WritePixelFast и ReadPixelFast, они не на всех компах работают без глюков, лучше делай обычные WritePixel и ReadPixel.
Не уверен, сколько юзал - всегда пахало. А производительность возрастает многократно. Буфер лочил?

SBJoker 25.08.2008 16:27

Ответ: CreateTexture
 
Я провел эксперимент и скажу что разницы между WritePixelFast(ReadPixelFast) и WritePixel(ReadPixel) нету никакой, главное залочить картинку. При залоченой картинке скорости опеих пар команд одинаковые. Видимо всё отличие только в том что команды без приставки Fast могут и без залочения работать, но медленее. Но с LockBuffer их скорость одинакова.

MiXaeL 26.08.2008 02:27

Ответ: CreateTexture
 
Кстати, подтверждаю, WritePixelFast без причин вылетает на моем компе. O_o
Причем довольно странно: в дебаг режиме на RenderWorld, без дебага после нажатия Esc. Иногда просто выходит из программы почти сразу после старта.даже без ошибки.
С WritePixel таких проблем не обнаружилось.

tormoz 26.08.2008 02:37

Ответ: CreateTexture
 
WritePixelFast - кака
не юзайте, вылетает.
И хрен поймешь от чего это зависит.
Бывает полгода работает, потом внезапно начинает глючить

Tadeus 26.08.2008 15:42

Ответ: CreateTexture
 
Самое интересное - это то, что если использовать с ReadPixel/WritePixel совместно с LockBuffer/UnlockBuffer, то скорость на глаз, а может и не только, одинаковая с ReadPixelFast/WritePixelFast.:)

impersonalis 25.12.2008 13:50

Ответ: CreateTexture
 
Ну и чо никто не постанул: http://forum.boolean.name/showpost.p...56&postcount=3

L.D.M.T. 25.12.2008 14:26

Ответ: CreateTexture
 
WritePixelFast вылетает только тогда, когда параметры выходят за пределы экрана или текстуры.

impersonalis 25.12.2008 14:49

Ответ: CreateTexture
 
L.D.M.T. наконец-то хоть кто-то открыл нам истину!
в приведённом выше примере фиксится уменьшением верхней границы в циклах на одни пиксель

Это ведь ваще "фак мой моск": в половине семплов начало вывода в буфере считается за (0.0) и при этом до размеров, в то время как фактическое значение - (размер-1). Просто часть обработичков игнорируют такое надругательство.

DartWaider aka Yxo 12.02.2009 05:04

Ответ: CreateTexture
 
Если ещё актуально то выяснилось что можно копировать имэйдж в текстуру и с флагом маски, только пустой цвет(маскированый) записать как: А shl 24; где А от 0 до 128.

вот пример:

Код:

Graphics3D 800,600,16,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Dim pix(64,64)

cube=CreateCube()

Global img=LoadImage("tex.bmp")
Global tex=CreateTexture(64,64,5)

;--------------------------
        SetBuffer ImageBuffer(img)
                LockBuffer()
                For i=0 To 63
                        For j=0 To 63
                                pix(j,i)=ReadPixel(j,i)
                        Next
                Next
                UnlockBuffer()
        SetBuffer TextureBuffer(tex)
                LockBuffer()
                For i=0 To 63
                        For j=0 To 63
                                r=pix(j,i) Shr 16 And 255
                                g=pix(j,i) Shr 8 And 255
                                b=pix(j,i) And 255
                                If  Not r=g=b Then       
                                        WritePixel j,i,0 Shl 24; + r Shl 16 + g Shl 8 + b
                                Else
                                        WritePixel j,i,pix(j,i)
                                End If
                        Next
                Next
                UnlockBuffer()
        SetBuffer BackBuffer()
;------------------------

EntityTexture cube,tex

lit=CreateLight()
cam=CreateCamera()
CameraClsColor cam,63,63,63
PositionEntity cam,0,0,-5

EntityFX cube,17

Repeat

        x=x+2:y=x-z:z=x-y
        RotateEntity cube,x,y,z
       
        UpdateWorld()
        RenderWorld()
        Flip 1
Until KeyHit(1)
End

Нарисовать в паинте какую-то фигню размером 64х64 на чёрном фоне думаю не проблема.


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

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