PMG

Форумы по созданию игр
Текущее время: 14 июл 2026 15:24

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: 23 окт 2006 09:18 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Бр-р, что-то я запутался. Может так проще будет: OGL может рендерить только на одну сетку + одну текстуру, т.е. glDrawElements выполняется с одной привязанной текстурой, нельзя одновременно при выполнении glDrawElements использовать несколько текстур.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 24 окт 2006 10:40 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Вариантов кода по SkyBox, много. Вот один взять из книги Beginning OpenGL Game Programming (pmg.org.ru\ebooks):

Код:
#ifndef __SKYBOX_H_INCLUDED__
#define __SKYBOX_H_INCLUDED__

class CSkybox
{
public:
   CSkybox();
   ~CSkybox();

   void Initialize(float size);
   bool LoadTextures(char* top, char* bottom, char* front, char* back, char* left, char* right);
   void Render(float cameraX, float cameraY, float cameraZ);
   void Release();

   enum {
      SKY_TOP,
      SKY_BOTTOM,
      SKY_FRONT,
      SKY_BACK,
      SKY_LEFT,
      SKY_RIGHT
   };

protected:
   unsigned int m_textures[6];      // 6 texture objects
   float     m_size;
};


#ifdef _WINDOWS
#include <windows.h>
#endif

#include <gl/gl.h>
#include <gl/glu.h>
#include "glext.h"

#include "CTargaImage.h"
#include "Skybox.h"


CSkybox::CSkybox()
{
   for (int idx = 0; idx < 6; idx++)
      m_textures[idx] = 0;
}


CSkybox::~CSkybox()
{
   Release();
}


void CSkybox::Initialize(float size)
{
   m_size = size;
}


bool CSkybox::LoadTextures(char* top, char* bottom, char* front, char* back, char* left, char* right)
{
   CTargaImage image;

   image.Load(top);
   glGenTextures(1, &m_textures[SKY_TOP]);
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_TOP]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
   image.Release();

   image.Load(bottom);
   glGenTextures(1, &m_textures[SKY_BOTTOM]);
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_BOTTOM]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
   image.Release();

   image.Load(front);
   glGenTextures(1, &m_textures[SKY_FRONT]);
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_FRONT]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
   image.Release();

   image.Load(back);
   glGenTextures(1, &m_textures[SKY_BACK]);
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_BACK]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
   image.Release();

   image.Load(left);
   glGenTextures(1, &m_textures[SKY_LEFT]);
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_LEFT]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
   image.Release();

   image.Load(right);
   glGenTextures(1, &m_textures[SKY_RIGHT]);
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_RIGHT]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
   image.Release();

   return true;
}


void CSkybox::Render(float cameraX, float cameraY, float cameraZ)
{
   glPushMatrix();

   // Move the skybox so that it's centered on the camera.
   glTranslatef(cameraX, cameraY, cameraZ);

   glPushAttrib(GL_FOG_BIT | GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT);
   glDisable(GL_DEPTH_TEST);

   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

   // Top
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_TOP]);
   glBegin(GL_QUADS);
      glTexCoord2f(1.0f, 1.0f); glVertex3f(-m_size, m_size, -m_size);
      glTexCoord2f(0.0f, 1.0f); glVertex3f(m_size, m_size, -m_size);
      glTexCoord2f(0.0f, 0.0f); glVertex3f(m_size, m_size, m_size);
      glTexCoord2f(1.0f, 0.0f); glVertex3f(-m_size, m_size, m_size);
   glEnd();

   // Bottom
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_BOTTOM]);
   glBegin(GL_QUADS);
      glTexCoord2f(1.0f, 1.0f); glVertex3f(m_size, -m_size, -m_size);
      glTexCoord2f(0.0f, 1.0f); glVertex3f(-m_size, -m_size, -m_size);
      glTexCoord2f(0.0f, 0.0f); glVertex3f(-m_size, -m_size, m_size);
      glTexCoord2f(1.0f, 0.0f); glVertex3f(m_size, -m_size, m_size);
   glEnd();

   // Front
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_FRONT]);
   glBegin(GL_QUADS);
   glTexCoord2f(0.0f, 0.0f); glVertex3f(-m_size, -m_size, -m_size);
   glTexCoord2f(1.0f, 0.0f); glVertex3f(m_size, -m_size, -m_size);
   glTexCoord2f(1.0f, 1.0f); glVertex3f(m_size, m_size, -m_size);
   glTexCoord2f(0.0f, 1.0f); glVertex3f(-m_size, m_size, -m_size);
   glEnd();

   // Back
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_BACK]);
   glBegin(GL_QUADS);
      glTexCoord2f(0.0f, 0.0f); glVertex3f(m_size, -m_size, m_size);
      glTexCoord2f(1.0f, 0.0f); glVertex3f(-m_size, -m_size, m_size);
      glTexCoord2f(1.0f, 1.0f); glVertex3f(-m_size, m_size, m_size);
      glTexCoord2f(0.0f, 1.0f); glVertex3f(m_size, m_size, m_size);
   glEnd();

   // Right
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_RIGHT]);
   glBegin(GL_QUADS);
      glTexCoord2f(1.0f, 0.0f); glVertex3f(m_size, -m_size, m_size);
      glTexCoord2f(1.0f, 1.0f); glVertex3f(m_size, m_size, m_size);
      glTexCoord2f(0.0f, 1.0f); glVertex3f(m_size, m_size, -m_size);
      glTexCoord2f(0.0f, 0.0f); glVertex3f(m_size, -m_size, -m_size);
   glEnd();

   // Left
   glBindTexture(GL_TEXTURE_2D, m_textures[SKY_LEFT]);
   glBegin(GL_QUADS);
   glTexCoord2f(1.0f, 0.0f); glVertex3f(-m_size, -m_size, -m_size);
      glTexCoord2f(1.0f, 1.0f); glVertex3f(-m_size, m_size, -m_size);
      glTexCoord2f(0.0f, 1.0f); glVertex3f(-m_size, m_size, m_size);
      glTexCoord2f(0.0f, 0.0f); glVertex3f(-m_size, -m_size, m_size);
   glEnd();

   glPopAttrib();
   glEndList();
   glPopMatrix();
}


void CSkybox::Release()
{
   for (int i = 0; i < 6; ++i)
      glDeleteTextures(6, &m_textures[0]);
}
#endif // __SKYBOX_H_INCLUDED__

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


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

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


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

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


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

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