//
// New.c
// Gmaedemo
//
//
#include
#include
#include
#include "SOIL.h"
#define TITLE "Test"
#define WIDTH 1024
#define HEIGHT 768
GLFWwindow* window;
#define UPDATE_INTERVAL 1 /* 10ms */
GLuint texture[5];
GLuint texture1;
GLuint Loadbmpfile(const char* Image)
{
GLuint Tex;
printf("Reading image %s\n", Image);
FILE* img = NULL;
img = fopen(Image,"rb");
unsigned long bWidth = 0;
unsigned long bHeight = 0;
unsigned int size = 0;
fseek(img,18,SEEK_SET);
fread(&bWidth,4,1,img);
fread(&bHeight,4,1,img);
fseek(img,0,SEEK_END);
size = ftell(img) - 54;
unsigned char *data = (unsigned char*)malloc(size);
fseek(img,54,SEEK_SET); // image data
fread(data,size,1,img);
fclose(img);
glGenTextures(1, &Tex);
glBindTexture(GL_TEXTURE_2D, Tex);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
//glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bWidth, bHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
if (data)
free(data);
return Tex;
}
//取时间
static uint32_t _gettime(void) {
uint32_t t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = (uint32_t)(tv.tv_sec & 0xffffff) * 100;
t += tv.tv_usec / 10000;
return t;
}
//取按键
static void _glfw_key_cb(GLFWwindow* window, int key, int scancode, int action, int mods) {
if(key == GLFW_KEY_Q && action == GLFW_PRESS) {
glfwSetWindowShouldClose(window, GL_TRUE);
}
}
void init(){
if (glfwInit() != GL_TRUE){
printf("Unable to initialize GLFW");
}
glfwDefaultWindowHints();
glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // the window will stay hidden after creation
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // the window will be resizable
window = glfwCreateWindow(WIDTH, HEIGHT, TITLE, NULL, NULL);
if (window == NULL) {
glfwTerminate();
printf("Failed to create the GLFW window");
}
glfwSetKeyCallback(window,_glfw_key_cb);
glfwMakeContextCurrent(window);
// Enable v-sync
glfwSwapInterval(1);
// Make the window visible
glfwShowWindow(window);
}
//显示图片
void drawTex2D(GLuint textureId, int x, int y, int width, int height) {
glTranslatef(x, y, 0);
glBindTexture(GL_TEXTURE_2D, textureId);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(1, 0);
glVertex2f(width, 0);
glTexCoord2f(1, 1);
glVertex2f(width, height);
glTexCoord2f(0, 1);
glVertex2f(0, height);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glLoadIdentity();
}
void update(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
for(int si=0;si<=5;si++){
drawTex2D(texture[si], 470+(si)*48, 0, 48, 160);
}
drawTex2D(texture1, 0, 0, 470, 436);
glFlush();
}
void setupgl(){
// 操作投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // 复位
// 将坐标系置为左上角(0,0),右下角(width,height)
glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
// 操作模型矩阵
glMatrixMode(GL_MODELVIEW);
// 开启2D纹理支持
glEnable(GL_TEXTURE_2D);
// 开启混合渲染
glEnable(GL_BLEND);
}
void settex(){
for(int i=0;i<=5;i++){
texture[i] = Loadbmpfile("2.bmp");
}
texture1 = Loadbmpfile("uvtemplate.bmp");
}
void loop(){
glViewport(0, 0, WIDTH*2, HEIGHT*2);
uint32_t timestamp = 0;
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
while (glfwWindowShouldClose(window) == GL_FALSE) {
uint32_t current = _gettime();
if(current - timestamp >= UPDATE_INTERVAL) {
timestamp = current;
update();
GLenum error = glGetError();
if(error != GL_NO_ERROR)
printf("error: %d\n",error);
}
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
}
int main(){
init();
setupgl();
settex();
loop();
return 0;
}