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);//模型列表


     

  • 相关阅读:
    使用手机重量加速器
    改变 Pivot 的 HeaderTemplate
    页面构造函数和 Load 事件的执行次数
    给 ListBox 的 DataTemplate 模板中的 元素设置动画
    在ItemsControl 中,添加头部下拉更新
    (转) Unix 时间戳 与 .NET 时间转换
    图片保存到本机(链接)
    IsHitTestVisible="False" 的功能
    回到顶部按钮
    ssh访问服务器端visdom
  • 原文地址:https://www.cnblogs.com/fangxiang/p/585384.html
Copyright © 2011-2022 走看看