Jeff Molofee - NeHe's OpenGL Tutorials

Здесь есть возможность читать онлайн «Jeff Molofee - NeHe's OpenGL Tutorials» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на английском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

NeHe's OpenGL Tutorials: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «NeHe's OpenGL Tutorials»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

NeHe's OpenGL Tutorials — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «NeHe's OpenGL Tutorials», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

glDisable(GL_BLEND);

glDisable(GL_LIGHTING);

doCube();

Second Pass:

• Use inverted bump-texture

• Enable Blending GL_ONE, GL_ONE

• Keep Lighting disabled

• Use offset texture-coordinates (This means that you call SetUpBumps() before each face of the cube

• Do the geometry

This will render a cube with the correct emboss bump mapping, but without colors.

You could save computing time by just rotating the lightvector into inverted direction. However, this didn't work out correctly, so we do it the plain way: rotate each normal and center-point the same way we rotate our geometry!

glBindTexture(GL_TEXTURE_2D, invbump[filter]);

glBlendFunc(GL_ONE,GL_ONE);

glDepthFunc(GL_LEQUAL);

glEnable(GL_BLEND);

glBegin(GL_QUADS);

// Front Face

n[0]=0.0f;

n[1]=0.0f;

n[2]=1.0f;

s[0]=1.0f;

s[1]=0.0f;

s[2]=0.0f;

t[0]=0.0f;

t[1]=1.0f;

t[2]=0.0f;

for (i=0; i<4; i++) {

c[0]=data[5*i+2];

c[1]=data[5*i+3];

c[2]=data[5*i+4];

SetUpBumps(n,c,l,s,t);

glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]);

glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]);

}

// Back Face

n[0]=0.0f;

n[1]=0.0f;

n[2]=-1.0f;

s[0]=-1.0f;

s[1]=0.0f;

s[2]=0.0f;

t[0]=0.0f;

t[1]=1.0f;

t[2]=0.0f;

for (i=4; i<8; i++) {

c[0]=data[5*i+2];

c[1]=data[5*i+3];

c[2]=data[5*i+4];

SetUpBumps(n,c,l,s,t);

glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]);

glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]);

}

// Top Face

n[0]=0.0f;

n[1]=1.0f;

n[2]=0.0f;

s[0]=1.0f;

s[1]=0.0f;

s[2]=0.0f;

t[0]=0.0f;

t[1]=0.0f;

t[2]=-1.0f;

for (i=8; i<12; i++) {

c[0]=data[5*i+2];

c[1]=data[5*i+3];

c[2]=data[5*i+4];

SetUpBumps(n,c,l,s,t);

glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]);

glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]);

}

// Bottom Face

n[0]=0.0f;

n[1]=-1.0f;

n[2]=0.0f;

s[0]=-1.0f;

s[1]=0.0f;

s[2]=0.0f;

t[0]=0.0f;

t[1]=0.0f;

t[2]=-1.0f;

for (i=12; i<16; i++) {

c[0]=data[5*i+2];

c[1]=data[5*i+3];

c[2]=data[5*i+4];

SetUpBumps(n,c,l,s,t);

glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]);

glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]);

}

// Right Face

n[0]=1.0f;

n[1]=0.0f;

n[2]=0.0f;

s[0]=0.0f;

s[1]=0.0f;

s[2]=-1.0f;

t[0]=0.0f;

t[1]=1.0f;

t[2]=0.0f;

for (i=16; i<20; i++) {

c[0]=data[5*i+2];

c[1]=data[5*i+3];

c[2]=data[5*i+4];

SetUpBumps(n,c,l,s,t);

glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]);

glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]);

}

// Left Face

n[0]=-1.0f;

n[1]=0.0f;

n[2]=0.0f;

s[0]=0.0f;

s[1]=0.0f;

s[2]=1.0f;

t[0]=0.0f;

t[1]=1.0f;

t[2]=0.0f;

for (i=20; i<24; i++) {

c[0]=data[5*i+2];

c[1]=data[5*i+3];

c[2]=data[5*i+4];

SetUpBumps(n,c,l,s,t);

glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]);

glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]);

}

glEnd();

Third Pass:

• Use (colored) base-texture

• Enable Blending GL_DST_COLOR, GL_SRC_COLOR

• This blending equation multiplies by 2: (Cdst*Csrc)+(Csrc*Cdst)=2(Csrc*Cdst)!

• Enable Lighting to do the ambient and diffuse stuff

• Reset GL_TEXTURE-matrix to go back to "normal" texture coordinates

• Do the geometry

This will finish cube-rendering, complete with lighting. Since we can switch back and forth between multitexturing and non-multitexturing, we have to reset the texture-environment to "normal" GL_MODULATE first. We only do the third pass, if the user doesn't want to see just the emboss.

if (!emboss) {

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

glBindTexture(GL_TEXTURE_2D,texture[filter]);

glBlendFunc(GL_DST_COLOR,GL_SRC_COLOR);

glEnable(GL_LIGHTING);

doCube();

}

Last Pass:

• update geometry (esp. rotations)

• do the Logos

xrot+=xspeed;

yrot+=yspeed;

if (xrot>360.0f) xrot-=360.0f;

if (xrot<0.0f) xrot+=360.0f;

if (yrot>360.0f) yrot-=360.0f;

if (yrot<0.0f) yrot+=360.0f;

/* LAST PASS: Do The Logos! */

doLogo();

return true; // Keep Going

}

This function will do the whole mess in 2 passes with multitexturing support. We support two texel-units. More would be extreme complicated due to the blending equations. Better trim to TNT instead. Note that almost the only difference to doMesh1TexelUnits() is, that we send two sets of texture-coordinates for each vertex!

bool doMesh2TexelUnits(void) {

GLfloat c[4]={0.0f,0.0f,0.0f,1.0f}; // Holds Current Vertex

GLfloat n[4]={0.0f,0.0f,0.0f,1.0f}; // Normalized Normal Of Current Surface

GLfloat s[4]={0.0f,0.0f,0.0f,1.0f}; // s-Texture Coordinate Direction, Normalized

GLfloat t[4]={0.0f,0.0f,0.0f,1.0f}; // t-Texture Coordinate Direction, Normalized

GLfloat l[4]; // Holds Our Lightposition To Be Transformed Into Object Space

GLfloat Minv[16]; // Holds The Inverted Modelview Matrix To Do So

int i;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer

// Build Inverse Modelview Matrix First. This Substitutes One Push/Pop With One glLoadIdentity();

// Simply Build It By Doing All Transformations Negated And In Reverse Order

glLoadIdentity();

glRotatef(-yrot,0.0f,1.0f,0.0f);

glRotatef(-xrot,1.0f,0.0f,0.0f);

glTranslatef(0.0f,0.0f,-z);

glGetFloatv(GL_MODELVIEW_MATRIX,Minv);

glLoadIdentity();

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «NeHe's OpenGL Tutorials»

Представляем Вашему вниманию похожие книги на «NeHe's OpenGL Tutorials» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Jeff Jacobson - Sleep Tight
Jeff Jacobson
Jeff Salyards - Veil of the Deserters
Jeff Salyards
Jeff LaSala - The Darkwood Mask
Jeff LaSala
Jeff Lindsay - Dexter's Final Cut
Jeff Lindsay
libcat.ru: книга без обложки
Неизвестный Автор
libcat.ru: книга без обложки
Неизвестный Автор
libcat.ru: книга без обложки
Неизвестный Автор
libcat.ru: книга без обложки
Неизвестный Автор
Отзывы о книге «NeHe's OpenGL Tutorials»

Обсуждение, отзывы о книге «NeHe's OpenGL Tutorials» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x