美文网首页
c++ opengl添加纹理

c++ opengl添加纹理

作者: 一路向后 | 来源:发表于2024-08-03 21:53 被阅读0次

1.源码实现

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

float angle = 0.0;

GLuint textureID;

void init()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_MULTISAMPLE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_TEXTURE_2D);

    glDepthFunc(GL_LEQUAL);
    glClearDepth(1.0f);

    GLfloat light_position[] = {1.0, -1.0, -0.5, 0.0};
    GLfloat light_ambient[] = {0.2, 0.2, 0.2, 1.0};
    GLfloat light_diffuse[] = {0.8, 0.8, 0.8, 1.0};

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);

    glEnable(GL_COLOR_MATERIAL);

    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);

    //生成纹理对象
    glGenTextures(1, &textureID);

    glBindTexture(GL_TEXTURE_2D, textureID);

    //加载图片并设置纹理参数
    int width, height, channels;
    unsigned char *image = stbi_load("texture.jpg", &width, &height, &channels, STBI_rgb);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);

    stbi_image_free(image);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}

void update(int value)
{
    angle += 2.0f;

    if(angle > 360)
    {
        angle -= 360;
    }

    glutPostRedisplay();

    glutTimerFunc(32, update, 0);
}

void drawCube()
{
    glBegin(GL_QUADS);

    glBindTexture(GL_TEXTURE_2D, textureID);

        //前面
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-0.5, -0.5, 0.5);
        glColor3f(1.0, 1.0, 0.0);
        glVertex3f(0.5, -0.5, 0.5);
        glColor3f(0.0, 1.0, 0.0);
        glVertex3f(0.5, 0.5, 0.5);
        glColor3f(0.0, 0.0, 1.0);
        glVertex3f(-0.5, 0.5, 0.5);

        //后面
        glColor3f(1.0, 0.0, 1.0);
        glVertex3f(-0.5, -0.5, -0.5);
        glColor3f(1.0, 1.0, 0.0);
        glVertex3f(0.5, -0.5, -0.5);
        glColor3f(0.0, 1.0, 0.0);
        glVertex3f(0.5, 0.5, -0.5);
        glColor3f(0.0, 0.0, 1.0);
        glVertex3f(-0.5, 0.5, -0.5);

        //左面
        glColor3f(1.0, 1.0, 1.0);
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
        glVertex3f(-0.5, -0.5, -0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
        glVertex3f(-0.5, -0.5, 0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
        glVertex3f(-0.5, 0.5, 0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
        glVertex3f(-0.5, 0.5, -0.5);

        //右面
        glColor3f(1.0, 0.0, 1.0);
        glVertex3f(0.5, -0.5, -0.5);
        glColor3f(1.0, 1.0, 0.0);
        glVertex3f(0.5, -0.5, 0.5);
        glColor3f(0.0, 1.0, 0.0);
        glVertex3f(0.5, 0.5, 0.5);
        glColor3f(0.0, 0.0, 1.0);
        glVertex3f(0.5, 0.5, -0.5);

        //上面
        glColor3f(1.0, 1.0, 1.0);
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
        glVertex3f(-0.5, 0.5, -0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
        glVertex3f(0.5, 0.5, -0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
        glVertex3f(0.5, 0.5, 0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
        glVertex3f(-0.5, 0.5, 0.5);

        //下面
        glColor3f(1.0, 1.0, 1.0);
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
        glVertex3f(-0.5, -0.5, 0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
        glVertex3f(0.5, -0.5, 0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
        glVertex3f(0.5, -0.5, -0.5);
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
        glVertex3f(-0.5, -0.5, -0.5);
        glEnd();
}

void display()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glRotatef(angle, 0.0f, 1.0f, 0.0f);
    glRotatef(angle, 0.0f, 0.0f, 1.0f);

    //glTranslatef(0.0f, 0.0f, -0.3f);

    drawCube();

    glFlush();

    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH|GLUT_MULTISAMPLE);
    glutInitWindowSize(400, 400);

    glutCreateWindow("OpenGL texture example");

    init();
    glutDisplayFunc(display);
    glutTimerFunc(16, update, 0);

    glutMainLoop();

    return 0;
}

2.编译源码

$ g++ -o example example.cpp -std=c++11 -I/opt/apps/wxwidget/include -L/opt/apps/wxwidget/lib -lGL -lglut -Wl,-rpath=/opt/apps/wxwidget/lib

3.素材图片

texture.jpg

4.运行结果

屏幕截图 2024-08-04 215205.png

相关文章

  • Android OpenGL添加纹理

    1 相关基础 1.1 贴纹理原理简单概述 其实贴纹理的原理非常简单,就是给每个三角形贴上图片即可。那么如何给三角形...

  • Android OpenGL添加纹理

    转载请注明出处:【huachao1001的简书:http://www.jianshu.com/users/0a7e...

  • GLKit常用API解析

    GLKTextureInfo 创建OpenGL纹理信息 name: OpenGL上下文中纹理名称 target: ...

  • OpenGL ES GLKit 􏰼􏰜常用API解析

    GLKTextureInfo创建OpenGL纹理信息 name : OpenGL上下文中纹理名称 target :...

  • OpenGL纹理内容

    纹理可以理解为一张图片,OpenGL渲染图片会将图片的像素保存在纹理缓存中。 OpenGL常用纹理函数 载入纹理 ...

  • OpenGL纹理

    纹理可以理解为一张图片,OpenGL渲染图片会将图片的像素保存在纹理缓存中。OpenGL常用纹理函数 载入纹理 纹...

  • OPenGL ES纹理翻转解决方案

    纹理翻转 在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL要求纹理坐标原...

  • OpenGL坐标概念

    openGL 顶点,坐标系,纹理坐标Android OpenGL es 纹理坐标设定与贴图规则对Android o...

  • OpenGL之纹理及应用案例

    纹理介绍 OpenGL使用的图片数据(纹理)都是tga格式的,而iOS/OpenGL ES使用PNG/JPEG格式...

  • OpenGL 纹理翻转策略

    Open GL纹理翻转 在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL...

网友评论

      本文标题:c++ opengl添加纹理

      本文链接:https://www.haomeiwen.com/subject/hhazhjtx.html