zoukankan      html  css  js  c++  java
  • 3D纹理和过程纹理

    过程纹理可以生成自然界中的很多图案,如模拟出云彩,大理石,木材。
    一般都需要使用perlin noise函数,这个函数是连续的,因此图像的明暗
    过渡是平滑的。
    可以将过程纹理扩展到三维,这样就生成3D纹理,3D纹理是很费内存的。
    用Opengl处理的代码如下:
    1,创造3D纹理
    glGenTextures(1, &texname); 
    glBindTexture(GL_TEXTURE_3D, texname); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);

    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, WIDTH, HEIGHT, DEPTH, 0, GL_RGB, GL_UNSIGNED_BYTE,
      tex); //tex是生成过程纹理的函数
    2,生成纹理坐标
    float xPlane[] = {1.0f, 0.0f, 0.0f, 0.0f};
    float yPlane[] = {0.0f, 1.0f, 0.0f, 0.0f};
    float zPlane[] = {0.0f, 0.0f, 1.0f, 0.0f}; 
    glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
    glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
    glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);

    glTexGenfv(GL_S,GL_EYE_PLANE,xPlane);
    glTexGenfv(GL_T,GL_EYE_PLANE,yPlane);
    glTexGenfv(GL_R,GL_EYE_PLANE,zPlane);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    glEnable(GL_TEXTURE_GEN_R);

    glMatrixMode(GL_TEXTURE);
    glEnable(GL_TEXTURE_3D);
    glLoadIdentity();
    glTranslatef(0.5f,0.5f,0.5f);
    glScalef(0.5f,0.5f,0.5f);
    glMultMatrixf(mat);//MODELVIEW matrix 转置矩阵

    glEnable(GL_TEXTURE_3D);
    glBindTexture(GL_TEXTURE_3D, texname);
    glCallList(list);//模型列表


     

  • 相关阅读:
    RMQ(非log2储存方法)
    2016年5月份学习记录
    NOIP200504循环
    膜拜acm大牛 虽然我不会这题,但是AC还是没有问题的~(转自hzwer)
    最长公共子序列的长度
    菜鸟,大牛和教主三者的区别(转自hzwer)
    NOIP201205Vigenère密码
    NOIP200503采药
    公路乘车
    NOIP200902分数线划定
  • 原文地址:https://www.cnblogs.com/fangxiang/p/585384.html
Copyright © 2011-2022 走看看