GLSL学习-波浪立方体

本文介绍了一个使用GLSL编程实现带有波浪效果的立方体示例。通过加载纹理,设置顶点、纹理坐标和法线,结合GLSL着色器在OpenGL环境中创建动态变化的立方体。GLSL着色器包括顶点和片段着色器,分别处理顶点变换和光照计算,实现纹理混合和波浪效果。
摘要由CSDN通过智能技术生成

//CPP file

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <GL/glew.h>
#include <GL/glut.h>

float vertexArray[50][50*4*3];
float textureArray[50][50*4*2];
float normalArray[50][50*4*3];

#define BMP_Header_Length 54
GLuint loadTexture(char *file)
{
    GLint width, height, total_bytes;
    GLubyte* pixels = 0;
    GLuint last_texture_ID, texture_ID = 0;

    //打开文件,如果失败,返回
    FILE* pFile = fopen(file, "rb");
    if(pFile == 0)
    {
        printf("Can not open file %s...", file);
        return 0;
    }

    //读取文件中图象的宽度和高度
    fseek(pFile, 0x0012, SEEK_SET);
    fread(&width, 4, 1, pFile);
    fread(&height, 4, 1, pFile);
    fseek(pFile, BMP_Header_Length, SEEK_SET);

    //计算每行像素所占字节数,并根据此数据计算总像素字节数
    {
        GLint line_bytes = width * 3;
        while(line_bytes % 4 != 0)
        {
            ++line_bytes;
        }
        total_bytes = line_bytes * height;
    }

    //根据总像素字节数分配内存
    pixels = (GLubyte*)malloc(total_bytes);
    if(pixels == 0)
    {
        printf("Pixeles in file %s is NULL...", file);
        fclose(pFile);
        return 0;
    }

    //读取像素数据
    if(fread(pixels, total_bytes, 1, pFile) <= 0)
    {
        free(pixels);
        fclose(pFile);
        return 0;
    }

    // 分配一个新的纹理编号
    glGenTextures(1, &texture_ID);
    if( texture_ID == 0 )
     {
        free(pixels);
        fclose(pFile);
        return 0;
     }

    //绑定新的纹理,载入纹理并设置纹理参数
    //在绑定前,先获得原来绑定的纹理编号,以便在最后进行恢复
    glGetIntegerv(GL_TEXTURE_BINDING_2D,(GLint*)&last_texture_ID);
    glBindTexture(GL_TEXTURE_2D, texture_ID);

    //纹理过滤设定
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    //颜色混合模式
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);
    glBindTexture(GL_TEXTURE_2D, last_texture_ID);

    //之前为pixels分配的内存可在使用glTexImage2D以后释放
    //因为此时像素数据已经被OpenGL另行保存了一份(可能被保存到专门的图形硬件中)
    free(pixels);
    return texture_ID;
}

int texture01 = 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值