Чет не выходит.. прозрачность...

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

webgrs
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 19.02.2004 (Чт) 1:39

Чет не выходит.. прозрачность...

Сообщение webgrs » 11.03.2004 (Чт) 8:45

Сразу скажу, что я работаю в vb .net

И вот такая проблема, на экран рендерится объект, моделька, в которой есть части, которые покрыты текстурой с альфа-каналом, т.е. определенные цвет прозрачный насквозь. И проблема в том, что в итоге объект очень странно отображается... некоторые части не прозрачные... думал, думал почему так может получатся.. и тут доперло, что когда происходит цикл текстурирования объектов модели, на которые натянуты текстуры прозрачные, то сначала рендерится первый объект модели затем второй и так до конца, каждая часть одевается в свою текстуру, но в итоге прозрачная часть будет лишь в том случае, если объекты рендерились попорядку, а не первый рендерился в торым в итоге получая что-то такое:

Изображение

На заднем плане стоят деревья в которых объекты в разнабой сделаны ф редакторе...

а то что объведено кружочком, я сделал первую ветку, зане й вторая, и третия в точной последовательности...

а вот как реализован алгоритм
Код: Выделить всё

'Это пишу в цикл рендеринга
        Dev.RenderState.AlphaBlendEnable = True

        muoviObj(0.8, 0.8, 0.8, 90, 40, 0, 0, -20, -10)
        For i = 0 To modello.numX
            Dev.Material = modello.mat(i)
            Dev.SetTexture(0, modello.tex(i))
            modello.mesh.DrawSubset(i)
        Next




Код: Выделить всё

'Это загрузка модели и текстур


Public modello As oggX

    Structure oggX
        'struttura per la gestione semplice delle mesh
        Public mesh As Mesh
        Public numX As Integer
        Public tex() As Texture
        Public mat() As Material
    End Structure



    Function creaMesh(ByVal fileSrc As String, ByVal materialiOn As Boolean, ByVal textureOn As Boolean, ByVal TexPath As String) As oggX


modello = creaMesh(AppPath() & "\models\tree.x", True, True, AppPath)


        With creaMesh
         
            Dim materiali() As ExtendedMaterial
            .mesh = Mesh.FromFile(fileSrc, MeshFlags.Dynamic, dev, materiali)
           
            .numX = UBound(materiali)
            ReDim .tex(.numX)
            ReDim .mat(.numX)
            Dim i As Integer
           
            For i = 0 To .numX
                If textureOn Then
                   
                    If materiali(i).TextureFilename <> "" Then
                        .tex(i) = TextureLoader.FromFile(dev, TexPath & "\textures\" & materiali(i).TextureFilename, 0, 0, 1, 0, Format.A1R5G5B5, Pool.Default, Filter.Linear, Filter.Linear, Drawing.Color.White.ToArgb)
                    End If
                End If
                If materialiOn Then
                    .mat(i) = materiali(i).Material3D
                    .mat(i).Ambient = .mat(i).Diffuse
                End If
            Next
        End With
    End Function



вроде это весь код, для отображения модельки.. ну кроме расположения ее в World.

если, кто-то что-то не понял.. скажите... не умею объеснять =)

webgrs
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 19.02.2004 (Чт) 1:39

Сообщение webgrs » 11.03.2004 (Чт) 8:56

еще раз поясню...
если размещаю объекты модели в таком порядке, то все части прозрачные. Но так делать не реально, так как нужно знать какой порядковый номер у объекта и размещать его относительно всех по порядку, и все это присоздании модели.
Код: Выделить всё
_1
  _2
   _3


а если так, как это вообще и происходит.. при создании модели
рендерится части, которые прозрачные, но за ними не видно другой ветки дерева =(
Код: Выделить всё
_1
  _3
   _2

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.03.2004 (Чт) 15:41

Видимо ты используешь AlfaBlend, а нужно AlfaTest. А если все же пользоваться AlfaBlend - придется упорядочивать полигоны...
После включения AlfaTestEnable=true подбери оптимальное значение D3DRS_ALPHAREF - от 0 до 255, обычно 128.

webgrs
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 19.02.2004 (Чт) 1:39

Сообщение webgrs » 12.03.2004 (Пт) 21:41

Спасибо Mikle, отлично работает :)

Только у меня еще одна проблема... заразка виснит иногда, имею ввиду программу, причем полностью подвисает и весь компутер...
в чем ошибка в коде даже и не знаю =(

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.03.2004 (Сб) 17:08

Ну если другие 3D программы не виснут, а только эта - так сразу не ответишь. Может ты в конце программы не удаляешь полностью все объекты, которые создаешь? Или проблемма со сворачиванием окна (см. соседнюю тему про Alt+Tab)?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 14.03.2004 (Вс) 1:38

Возможная ошибка - "индекс вне диапазона" - ее трудно вычислить, и висяки получаются крутые даже в 2D DX.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

    TopList