| PMG http://forum.pmg.org.ru/ |
|
| КОНВЕЙЕР: БЫСТРОЕ ПРОХОЖДЕНИЕ ГЕОМЕТРИИ http://forum.pmg.org.ru/viewtopic.php?f=1&t=842 |
Страница 1 из 1 |
| Автор: | MagicWolf [ 23 окт 2006 09:18 ] |
| Заголовок сообщения: | |
Бр-р, что-то я запутался. Может так проще будет: OGL может рендерить только на одну сетку + одну текстуру, т.е. glDrawElements выполняется с одной привязанной текстурой, нельзя одновременно при выполнении glDrawElements использовать несколько текстур. |
|
| Автор: | MagicWolf [ 24 окт 2006 10:40 ] |
| Заголовок сообщения: | |
Вариантов кода по 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__ |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|