zoukankan      html  css  js  c++  java
  • OpenGL_ES-纹理


                                                OpenGL_ES2.0 -纹理



    :纹理基础:


             1: 纹素的概念:

           一个二维纹理在OpenGLES2.0中是非经常见的,二维纹理就是一个二维数组,每一个数据元素称为纹素,详细格式例如以下:

    GL_RGB (Red, Green, Blue)

    GL_RGBA (Red, Green, Blue, Alpha)

    GL_LUMINANCE (Luminance 亮度)

    GL_LUMINANCE_ALPHA(Luminance, Alpha)

    GL_ALPHA (Alpha)


    2:纹理坐标概念:











            3: 天空盒的概念:

                   天空盒由六个面组成。每一个面是一个二维纹理,纹理坐标的算法是由中心点取一条射线。与面的交点即是纹理坐标。


    :加载纹理和多级纹理技术

    第一步: 创建纹理对象。

    glGenTextures(GLsizein, GLuint *textures)

    删除纹理对象。

    glDeleteTextures(GLsizein, GLuint *textures)


    第二步: 绑定纹理对象。

    glBindTexture(GLenumtarget, GLuint texture)


    第三步: 向显卡传输纹理数据

    glTexImage2D(GLenumtarget, GLint level,

         GLenuminternalFormat, GLsizei width,

         GLsizeiheight, GLint border,

         GLenumformat, GLenum type, const void* pixels)


    代码样例:

    //纹理对象句柄
    
    GLuinttextureId;
    
    //2 x 2 图像,3 字节 每一个像素(R,G, B)
    
    GLubytepixels[4 * 3] =
    
    {
    
        255,0,0,// 红
    
        0,255,0,// 绿
    
        0,0,255, // 蓝
    
        255,255,0// 黄
    
    };
    
    //使用紧密包装数据
    
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);
    
    //生成纹理对象
    
    glGenTextures(1,&textureId);
    
    //绑定纹理对象
    
    glBindTexture(GL_TEXTURE_2D,textureId);
    
    //加载纹理(向GPU传送)
    
    glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, 2, 2, 0, GL_RGB,
    
    GL_UNSIGNED_BYTE,pixels);
    
    //设置纹理过滤(稍后会讲到)
    
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);



    :纹理过滤和包装

             非常多时候。我们把一个图片贴到一个模型上。并不刚好合适。那么就须要调整, 调整往往包括两个方面,大小缩放以及包装模式设置。

    glTexParameteri(GLenumtarget, GLenum pname, GLint param)

    glTexParameteriv(GLenumtarget, GLenum pname, const GLint *params)

    glTexParameterf(GLenumtarget, GLenum pname, GLfloat param)

    glTexParameterfv(GLenumtarget, GLenum pname, const GLfloat *params)

              生成多级纹理。 在LOD中会用到:

                 glGenerateMipmap(GLenumtarget)



    :在片段着色器中使用纹理

             在片段着色器中能够使用纹理。 详细使用过程例如以下:

             第一步: 绑定到当前纹理, 然后帮当期纹理对象句柄传递给一致变量。

            
    //找到一致变量
    
    userData->samplerLoc= glGetUniformLocation(
    
    userData->programObject,"s_texture");
    
    //...
    
    //绑定纹理对象
    
    glActiveTexture(GL_TEXTURE0);
    
    glBindTexture(GL_TEXTURE_2D,userData->textureId);
    
    //设置纹理对象句柄(纹理单元)到一致变量
    
    glUniform1i(userData->samplerLoc,0);

     


                第二步:写Shader,利用Shader提供的系统函数使用纹理  texture2D(sampler2Dsampler, vec2 coord[,float bias])

    GLbytevShaderStr[] =
    
    "attributevec4 a_position;
    "
    
    "attributevec2 a_texCoord;
    "
    
    "varyingvec2 v_texCoord;
    "
    
    "voidmain()
    
    "{
    
    "
    
    gl_Position= a_position;
    
    "
    
    v_texCoord= a_texCoord;
    
    "}
    
    
    GLbytefShaderStr[] =
    
    "precisionmediump float;
    "
    
    "varyingvec2 v_texCoord;
    "
    
    "uniformsampler2D s_texture;
    "
    
    "voidmain()
    "
    
    "{
    "
    
    "gl_FragColor = texture2D(s_texture, v_texCoord); 
    ""}
    ";



    :纹理子图指定

    glTexSubImage2D(GLenumtarget, GLint level,

         GLint xoffset,GLint yoffset,

         GLsizei width,GLsizei height,

         GLenum format,GLenum type, const void* pixels)

                  这个函数同意更新纹理图形的一部分,效率比glTexImage2D要高。





    :从颜色缓冲区读取纹理数据

            这部分和帧缓冲区相关, 还与像素缓冲区相关,OpenGLES提供了两个函数同意从颜色缓冲区读取数据到纹理,假设进一步了解缓冲区知识的话。相信您会知  道開始像素缓冲区。拷贝过程效率更高一些。

             glCopyTexImage2D(GLenumtarget, GLint level,

                 GLenuminternalFormat, GLint x,

                 GLint y,GLsizei width,

                 GLsizeiheight, GLint border )


    glCopyTexSubImage2D(GLenumtarget, GLint level,

    GLintlevel, GLint xoffset,

    GLintyoffset, GLint x, GLint y,

    GLsizeiwidth, GLsizei height)






            

  • 相关阅读:
    CC
    codeforces 984 E. Elevator
    codeforces 984 D. XOR-pyramid
    codeforces 984 C. Finite or not?
    codeforces 984 B. Minesweeper
    codeforces 984 A. Game
    Loj #6000. 「网络流 24 题」搭配飞行员
    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest 训练报告
    省赛训练 分块9题
    AC自动机 hdu 2222 Keywords Search
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7145302.html
Copyright © 2011-2022 走看看