PMG

Форумы по созданию игр
Текущее время: 19 апр 2024 22:27

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Не получается отрисовать текстуру на ладшафте :(
СообщениеДобавлено: 23 ноя 2011 22:52 
Не в сети
Новичок

Зарегистрирован: 23 ноя 2011 21:56
Сообщения: 2
Доброго времени суток! Никак не могу разобраться с отрисовкой текстуры на ладшафте...
У меня есть программа, которая отрисовывает ландшафт

Код:
#include <Windows.h>
#include "glut/glut.h"
#include <gl\GL.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>

#pragma comment (lib,"OpenGL32.lib")
#pragma comment (lib,"glut32.lib")

#ifdef _UNICODE
#undef _UNICODE
#include "il/il.h"
#include "il/ilu.h"

#define _UNICODE
#else
#include <il.h>
#endif

#pragma comment (lib,"DevIL.lib") 

//32 битный указатель на цвет для удобства работы
struct color {
   unsigned char b;
   unsigned char g;
   unsigned char r;
   unsigned char a;
} *hmap;


unsigned int hwidth;
unsigned int hheight;

class vertex{
public:
   float x;
   float y;
   float z;
   float nx;
   float ny;
   float nz;


};


float angle = 0.0f;
#define ZOOM_SCALE 50



vertex* initVertex(){
   ilInit();
   ILuint image;
   ilGenImages(1,&image);
   ilBindImage(image);
   ilLoadImage("hmap.jpg");
   
   //на всякий случай защитимся от загрузки не 32 битныx файлов
   ilConvertImage(IL_RGBA,IL_UNSIGNED_BYTE);

   //Получаем нужные для нас сведения о карте высоты
   hmap = (color*)ilGetData();
   hwidth = ilGetInteger(IL_IMAGE_WIDTH);
   hheight = ilGetInteger(IL_IMAGE_HEIGHT);   

   //заполняем координаты
   int counter = 0;
   vertex *v = new vertex [(hwidth)*(hheight)];
   for(unsigned int i = 0; i < (hheight); i++){
      for(unsigned int j = 0; j < (hwidth); j++){
         
         v[counter].x = i * 5;         
         v[counter].y = hmap[counter].g - 100;
         v[counter].z = j * 5;
         counter++;
      }
   }
   
   return v;
}

vertex* initNormals(vertex* v){
   //заполняем нормали
   for(unsigned int i = 0; i < (hheight*hwidth); i++){
      float Qx = v[i+1].x - v[i].x;
      float Qy = v[i+1].y - v[i].y;
      float Qz = v[i+1].z - v[i].z;
      float Px = v[i+2].x - v[i].x;
      float Py = v[i+2].y - v[i].y;
      float Pz = v[i+2].z - v[i].z;
      v[i].nx = v[i+1].nx = v[i+2].nx = Py*Qz - Pz*Qy;
      v[i].ny = v[i+1].ny = v[i+2].ny = Pz*Qx - Px*Qz;
      v[i].nz = v[i+1].nz = v[i+2].nz = Px*Qy - Py*Qx;
      //нормализация нормали
      float len = 1.0f/sqrtf(v[i].nx * v[i].nx + v[i].ny * v[i].ny + v[i].nz * v[i].nz);
      v[i].nx *= len;
      v[i].ny *= len;
      v[i].nz *= len;      
   }

   return v;
}




int* index(){
   
   int count = 0;

   int* Indices = new int [3*2*(hheight - 1)*(hwidth - 1)];

      for (unsigned int x = 0; x < (hwidth - 1); x++){
         
         for (unsigned int y = 0; y < (hheight - 1); y++){

                Indices[count++] = y * hheight + x;
                Indices[count++] = (y + 1) * hheight + x;
                Indices[count++] = (y + 1) * hheight + x + 1;
                Indices[count++] = y * hheight + x;
                Indices[count++] = (y + 1) * hheight + x + 1;
                Indices[count++] = y * hheight + x + 1;
         }
      }

return Indices;
}


vertex* N;
vertex* M;
vertex* V;

int* Ind;



void reshape(int width, int height){
   //задаем размер окна вывода
   glViewport(0, 0, width, height);
   //установка матрицы проекции в перспективную
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   float z = 100;
   glFrustum(-ZOOM_SCALE,ZOOM_SCALE,-ZOOM_SCALE,ZOOM_SCALE,ZOOM_SCALE*1.2f,10000);
   glTranslatef(0,0,-2*ZOOM_SCALE);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   //включим глубину, свет и источник света 0
   glEnable(GL_DEPTH);
   glEnable(GL_TEXTURE_2D);
}

float n = 0;

//рисуем кадр


void draw(void){
   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
   
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   glLoadIdentity();
   angle += 0.1f;
   
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glRotatef(30, 1, 0, 0);
   glRotatef(angle, 0, 1, 0);
   
   float pos[4] = {200,100,200,1};
   glLightfv(GL_LIGHT0, GL_POSITION, pos);
   
   
   glBegin(GL_LINES);
   
   glColor3f(1.0f, 0.0f, 0.0f);
   glVertex3f(0.0, 0.0f, 0.0f);
   glVertex3f(50.0, 0.0f, 0.0f);
   
   glColor3f(0.0f, 1.0f, 0.0f);
   glVertex3f(0.0, 0.0f, 0.0f);
   glVertex3f(0.0f, 50.0f, 0.0f);
   
   glColor3f(0.0f, 0.0f, 1.0f);
   glVertex3f(0.0, 0.0f, 0.0f);
   glVertex3f(0.0f, 0.0f, 50.0f);
   
   glEnd();
   
   glEnableClientState(GL_VERTEX_ARRAY);
   glEnableClientState(GL_NORMAL_ARRAY);
   glNormalPointer(GL_FLOAT,6*sizeof(float),&V[3]);
   glVertexPointer(3,GL_FLOAT,6*sizeof(float),V);
   glDrawElements(GL_TRIANGLES,3*2*(hheight-1)*(hwidth-1),GL_UNSIGNED_INT,Ind);
   glDisableClientState(GL_NORMAL_ARRAY);
   glDisableClientState(GL_VERTEX_ARRAY); 
   glFlush();
   glutSwapBuffers(); 
   glutPostRedisplay();
 
}

void main (int argc, char **argv){
   
   glutInit(&argc, argv);
   glutInitWindowSize(400, 300);
   glutInitWindowPosition(200, 100);

   N = initVertex();
   V = initNormals(N);
   Ind = index();
   //создание окна
   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
   glutCreateWindow("Hello world"); 
   glutReshapeFunc(reshape);
   glutDisplayFunc(draw); 
   glDisable(GL_LIGHTING); 
   glEnable(GL_COLOR_MATERIAL); 
   glutMainLoop();
 
}


Когда добавляю в нее текстуру... а т.е. класс, который отвечает за текстуру, заполняю массив координат текстур и соответствующие текстуре glEnableClientState и т.д. у меня возникает эксепшн (Unhandled exception at 0x0073fd05 in textureLanshaft.exe: 0xC0000005: Access violation reading location 0x00000000.)... непонятно почему... :oops: текстурный класс работающий без ладншафта текстуру отрисовывает... прямо не знаю что делать.. может кто-то уже сталкивался?

Код достаточно длинный поэтому кидаю ссылку на проект
http://depositfiles.com/files/jc7b1gk43


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается отрисовать текстуру на ладшафте :(
СообщениеДобавлено: 24 ноя 2011 11:06 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Проект посмотрю позже. Ты не смотрел книгу Focus on 3d Terrain Programming на _pmg.org.ru/ebooks/_ - там много примеров о ландшафте.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается отрисовать текстуру на ладшафте :(
СообщениеДобавлено: 24 ноя 2011 13:24 
Не в сети
Новичок

Зарегистрирован: 23 ноя 2011 21:56
Сообщения: 2
MagicWolf писал(а):
Проект посмотрю позже. Ты не смотрел книгу Focus on 3d Terrain Programming на _pmg.org.ru/ebooks/_ - там много примеров о ландшафте.


Спасибо большое за ответ :) Книгу обязательно посмотрю :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB