Войти
ПрограммированиеФорумГрафика

Генерация сферы. Ругается на DrawIndexedPrimitive

Страницы: 1 2 Следующая »
#0
14:08, 13 янв. 2012

Вот решил написать генератор планет.

//тут создаю и инсталирую виртексный и индексный буфер.
                IDirect3DVertexBuffer9 * vb = NULL;
    IDirect3DIndexBuffer9 * ib = NULL;
    
    unsigned short indexes[392041];
// думаю тут всё понятно
    dev->CreateVertexBuffer( 65342 * sizeof(vertex), D3DUSAGE_WRITEONLY,
                         D3DFVF_XYZ|D3DFVF_DIFFUSE, D3DPOOL_DEFAULT,
                         &vb,NULL);

    dev->CreateIndexBuffer( 392042 *sizeof(unsigned short),
                        D3DUSAGE_WRITEONLY, D3DFMT_INDEX16,
                        D3DPOOL_DEFAULT, &ib, NULL );

    void* vb_vertices;
    void* ib_indexes;
    
    sckotchik = 0;
       FILE *f;// это для лога
       if((f = fopen ("E:\\Documents and Settings\\User\\Мои документы\\Visual Studio 2010\\Projects\\1\\Debug\\err.txt","w")) == NULL)
       {MessageBox( NULL, "file don't open", "Error", MB_OK );}

        for(float sharphi = 0.0; sharphi <= 360; sharphi++)// тут пробигаюсь по всей сфере
        {
          for(float sharteta = 0.0; sharteta <= 180; sharteta++)
          {
            vecktorx = 0 + (cos(sharteta) * cos(sharphi)) * 3000;
            vecktory = 0 + (sin(sharteta) ) * 3000;;
            vecktorz = 0 + (cos(sharteta) * sin(sharphi)) * 3000;
            vertices[sckotchik].x =  vecktorx;
            vertices[sckotchik].y =  vecktory;
            vertices[sckotchik].z =  vecktorz;
            vertices[sckotchik].color = 0xFF00C000;
            fprintf(f, "%i||", sckotchik);
            fprintf(f, "%f %f %f %c\n", vertices[sckotchik].x, vertices[sckotchik].y, vertices[sckotchik].z, vertices[sckotchik].color);
            sckotchik++;}
        }
        sckotchikindexes = 0;
// для лога
        if((f = fopen ("E:\\Documents and Settings\\User\\Мои документы\\Visual Studio 2010\\Projects\\1\\Debug\\err1.txt","w")) == NULL)
       {MessageBox( NULL, "file don't open", "Error", MB_OK );}

        for(int i = 0.0; i <= 65340; i++)// создаю индыксы
          {    indexes[sckotchikindexes] = i;
        fprintf(f, "%i||", sckotchikindexes);
        fprintf(f, "%i\n", i);
            indexes[sckotchikindexes + 1] = i + 1;
            fprintf(f, "%i|", sckotchikindexes + 1);
            fprintf(f, "%i\n", i+1);
            indexes[sckotchikindexes + 2] = i + 180;
            fprintf(f, "%i||", sckotchikindexes+2);
            fprintf(f, "%i\n", i+180);
            indexes[sckotchikindexes + 3] = i;
            fprintf(f, "%i|", sckotchikindexes + 3);
            fprintf(f, "%i\n", i);
            indexes[sckotchikindexes + 4] = i + 180;
            fprintf(f, "%i|", sckotchikindexes + 4);
            fprintf(f, "%i\n", i+180);
            indexes[sckotchikindexes + 5] = i + 180 + 1;
            fprintf(f, "%i|", sckotchikindexes + 5);
            fprintf(f, "%i\n", i+1);
            sckotchikindexes = sckotchikindexes + 6;}

// далее думаю всё понятно
      vb->Lock(0,sizeof(vertices),(void**)&vb_vertices,0);
      memcpy(vb_vertices,vertices,sizeof(vertices));
      vb->Unlock();
      
      ib->Lock(0,sizeof(indexes),(void**)&ib_indexes,0);
      memcpy(ib_indexes,indexes,sizeof(indexes));
      ib->Unlock();
      
      dev->SetStreamSource(0,vb,0,sizeof(vertex));
      dev->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);
      dev->SetIndices( ib );
dev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,65341,0,392041);// когда доходит до этого места слитает.
Изображение удалено


#1
14:14, 13 янв. 2012

NULL ptr
поставь точку останова в месте ошибки и проверь указатели

#2
14:17, 13 янв. 2012

Объявление vertices где?

#3
14:19, 13 янв. 2012

Dzhekson6000
Ужасная каша.
Первое, что бросается в глаза: число вершин в буфере 65342, а при генерации индексов есть и бОльшие значения.
И вообще, нельзя было воспользоваться вызовом D3DXCreateSphere для генерации сферы?

#4
14:30, 13 янв. 2012

k119_55524
эм.. точку поставил а вот как проверить указатели незнаю.
slava_mib
> Объявление vertices где?
так как она слишком большая то объявлять в winmaine не получается. Я её сделал глобальной.

struct vertex
  {
    float x,y,z;
    unsigned long color;
  };
vertex vertices[65341];
alex-r
> И вообще, нельзя было воспользоваться вызовом D3DXCreateSphere для генерации
> сферы?
ну я не ищу лёгких путей =)
А если действительно то я планирую генерировать не просто сферу а сферу в оригинальным ландшафтом.
#5
14:58, 13 янв. 2012

Dzhekson6000
> эм.. точку поставил а вот как проверить указатели незнаю.
Глазами. Еще спроси, как название переменной прочитать.

#6
15:00, 13 янв. 2012

Вообще ошибка из за неправильных данных индексного буфера.

#7
15:06, 13 янв. 2012

-Eugene-
> Вообще ошибка из за неправильных данных индексного буфера.
возможно..
И как мне это проверить?
А если возможно ли ошибка если в массиви элементов больше чем индексов

#8
15:07, 13 янв. 2012

Сделай проще:
http://iquilezles.org/www/articles/patchedsphere/patchedsphere.htm

#9
15:13, 13 янв. 2012

Dzhekson6000
Индекс - тот же указатель, только на элемент массива. У тебя ошибка доступа к памяти, логично предположить, что некоторые индексы указывают за пределы массива вершин. Проверить аналитически.

#10
15:25, 13 янв. 2012
блевать от кода охота, этож надо так себе жизнь усложнять
alex-r
+1
#11
18:24, 13 янв. 2012

Dzhekson6000
> indexes[392041]
Dzhekson6000
> 6534
Dzhekson6000
> CreateIndexBuffer( 392042
Dzhekson6000
> sckotchik = 0;
Dzhekson6000
> sckotchikindexes = 0;
Dzhekson6000
> memcpy(vb_vertices,vertices,sizeof(vertices));
Dzhekson6000
> memcpy(ib_indexes,indexes,sizeof(indexes));

Идти учить программирование, С++, а также английский язык. Мало у тебя знаний для генератора планет. Очень мало.

#12
21:24, 13 янв. 2012

>>memcpy(vb_vertices,vertices,sizeof(vertices));
>>memcpy(ib_indexes,indexes,sizeof(indexes));
>Идти учить программирование, С++,
Тут нормально, так как это массив, а не указатель.

>>sckotchik = 0;
>>sckotchikindexes = 0;
>а также английский язык.
Или хотя бы транслит, а то что за сккотчик?

#13
21:38, 13 янв. 2012

Dzhekson6000
ну создать планету можно за ранее в максе
а грузить еще проще))))

#14
23:22, 13 янв. 2012

ArchiDevil
> а также английский язык
> индыксы
> слитает
Хотя-бы русский для начала.

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

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.