Steward
分享是一種喜悅、更是一種幸福
程式語言 - Simple DirectMedia Layer (SDL) - v1.2 - C/C++ - OpenGL 1.0 - Apply Multitexture
參考資訊:
https://github.com/gamedev-net/nehe-opengl
main.c
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include <GL/gl.h>
#define TEXCOORD(u, v) \
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, u, v); \
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, u, v)
int main(int argc, char *argv[])
{
const int W = 320;
const int H = 240;
GLuint tex[2] = { 0 };
GLdouble nearPlane = 0.1;
GLdouble farPlane = 100.0;
GLdouble top = nearPlane * tan(45.0 * 3.14159 / 360.0);
GLdouble right = top * ((GLfloat)W / (GLfloat)H);
SDL_Surface *bmp[2] = { 0 };
SDL_Surface *screen = NULL;
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(W, H, 16, SDL_SWSURFACE | SDL_OPENGL);
bmp[0] = SDL_LoadBMP("main.bmp");
bmp[1] = SDL_LoadBMP("bump.bmp");
glGenTextures(2, tex);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bmp[0]->w, bmp[0]->h, 0, GL_BGR, GL_UNSIGNED_BYTE, bmp[0]->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bmp[1]->w, bmp[1]->h, 0, GL_BGR, GL_UNSIGNED_BYTE, bmp[1]->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glViewport(0, 0, W, H);
glMatrixMode(GL_PROJECTION);
glFrustum(-right, right, -top, top, nearPlane, farPlane);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
glRotatef(45, 0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS);
TEXCOORD(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
TEXCOORD(1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
TEXCOORD(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
TEXCOORD(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
TEXCOORD(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
TEXCOORD(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
TEXCOORD(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
TEXCOORD(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
TEXCOORD(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
TEXCOORD(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
TEXCOORD(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
TEXCOORD(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
TEXCOORD(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
TEXCOORD(1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
TEXCOORD(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
TEXCOORD(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
TEXCOORD(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
TEXCOORD(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
TEXCOORD(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
TEXCOORD(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
TEXCOORD(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
TEXCOORD(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
TEXCOORD(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
TEXCOORD(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
SDL_GL_SwapBuffers();
SDL_Delay(3000);
glDeleteTextures(2, tex);
SDL_FreeSurface(bmp[0]);
SDL_FreeSurface(bmp[1]);
SDL_Quit();
return 0;
}
編譯、執行
$ gcc main.c -I/usr/include/SDL -o main -lSDL -lGL $ ./main

