`
gjhappyyy
  • 浏览: 260606 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

OpenGl纹理映射

 
阅读更多

本文主要分析如何将纹理映射到多边形和物体上,会包含几种纹理映射的方式。

准备好了纹理下面我们分析如何进行映射,将纹理数据映射到具体的物体上去。纹理坐标如下图所示。
假设图中的正方向就是我们要将纹理映射上去的物体(地面),那么我们需要按照图中的表示,为每个顶点指定一个纹理坐标,也称之为UV坐标,它的横向为s轴,纵向围t轴,如下图所示。关于stuv坐标可以参考一些3D图形学相关知识。
那么下面我们就按照图中的指示来为地面创建一个纹理坐标数组和缓冲区,代码如下:
byte[] tcs = {0,0, 1,0, 0,1, 1,1};
tcsBuf = ByteBuffer.allocateDirect(tcs.length);
tcsBuf.put(tcs).rewind();
准备好纹理的uv坐标之后,下面是最后一步,如何绘制该物体及纹理。代码如下:
 public void draw()
 {
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glVertexPointer(3, GL10.GL_BYTE, 0, vertsBuf); // use floor verts
    gl.glTexCoordPointer(2, GL10.GL_BYTE, 0, tcsBuf); // use tex coords
    gl.glEnable(GL10.GL_TEXTURE_2D);
    setTexture();
    gl.glNormal3f( 0, 1.0f, 0);   // facing up
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisable(GL10.GL_TEXTURE_2D);   // switch off texturing
 } // end of draw()
 private void setTexture()
 {
    gl.glBindTexture(GL10.GL_TEXTURE_2D, texNames[0]); // use the tex name
    // specify the texture for the currently bound tex name
    gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGB, imWidth, imHeight, 0,
                    GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, texBuf);
    // set the minification/magnification techniques
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
 } // end of setTexture()
其中大部分代码我们已经接触过,标注为红色的是需要我们解释的,glEnableClientState函数就是允许我们设置纹理坐标数组,而函数glTexCoordPointer就是将前面准备的纹理坐标缓冲区告诉Opengl,这样在绘制图形时,Opengl会自动的对纹理进行处理,并展现出来。
运行结果如下图所示。
图中的地面就是我们绘制的一个四边形,然后给映射了一个地面的纹理贴图上去形成的。这里我们是直接将一整张图给映射上去了,那么我们是否可以只映射图像的一部分呢?答案是肯定的,我们只需要改动UV坐标即可。UV坐标对应如下图所示。
这样应该很好理解,相当于我们只是映射了图像上的0.250.75之间的部分(整个图像的宽度和高度为1),即图像的中间部分。当然你同样可以更改这个坐标,来调整自己需要映射的部分,这在实际的游戏开发过程中是经常使用的,尤其是一些2D游戏的开发,会将很多小的图片放置到一个大的图片之上,做成一个图片集,就可以通过这种方式来确定需要映射图片集中的哪一个小的图块。按照上图的指示,我们将代码需要改成float类型的数据即可,如下所示。
float[] tcs = {0.25f,0.25f,0.75f,0.25f,0.25f,0.75f,0.75f,0.75f};
tcsBuf = ByteBuffer.allocateDirect(tcs.length*4).asFloatBuffer();
tcsBuf.put(tcs).rewind();
/////
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, tcsBuf);
运行效果如下图所示。
和第一个效果图相比很明显的纹理只去了图像的中间一部分,上面的两种方式都是将纹理映射到一个四边形上,但是在Opengl ES中最基本的应该是三角形,我们是否可以将纹理映射到三角形上呢,同样可以,对于三角形的纹理示意图如下所示。
就这样,同样的步骤适合于几何体中任何三角形,而且你甚至可以通过非常规方式的映射来扭曲纹理,产生各种特殊的效果。总而言之,纹理上的任何一点都可以映射到多边形的任何一点。或者换而言之,你可以对任何地点(uv)使用任何(st)而OpenGL ES则为你进行映射。

我们的纹理坐标系统在两个轴上都是从0.0  1.0,如果设置超出此范围的值会怎么样?根据视图的设置方式有两种选择。一种选择是平铺纹理。按OpenGL的术语,也叫“重复”。如果我们将第一个纹理坐标数组的所有1.0改为2.0
float[] tcs = {0.0f,0.0f, 2.0f,0.0f, 0.0f,2.0f, 2.0f,2.0f};
在加入如下代码来设置重复的效果。
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);
那么运行效果就会产生将多个相同的图像平铺到地面的四边形上,下如图所示。
另一种可能的选择是让OpenGL ES简单地将超过1.0的值限制为1.0,任何低于0.0的值限制为 0.0。这实际会引起边沿像素重复,从而产生奇怪的效果。将代码更改为如下所示:
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_CLAMP_TO_EDGE);
运行效果如下图所示,这个表现得非常明显。
到这里,我们几乎分析完了Opengl中纹理映射的各种方式,当然也还会有其他的方式,但是原理都一样,这里就不重复了,前面介绍的也都是将纹理映射在平面物体上,在文章的最后,我们将一个纹理映射到一个立方体上去。
首先定义纹理映射坐标,如下代码所示:
 private byte texCoords[] = { // 4 tex coords for each face
    0,0, 1,0, 0,1, 1,1,   0,0, 1,0, 0,1, 1,1,   0,0, 1,0, 0,1, 1,1,
    0,0, 1,0, 0,1, 1,1,   0,0, 1,0, 0,1, 1,1,   0,0, 1,0, 0,1, 1,1
 };
tcsBuf = ByteBuffer.allocateDirect(texCoords.length);
tcsBuf.put(texCoords).rewind();
然后再绘制时加入和之前同样的代码即可,如下所示。
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_BYTE, 0, tcsBuf); // use tex coords
gl.glEnable(GL10.GL_TEXTURE_2D);   // use texturing
指定纹理坐标缓冲区,开启纹理,运行效果就会出现一个贴了纹理的立方体,如下图所示。,
这样的渲染结果看上去比前面几个例子真实多了,这主要就是纹理的用作,因此纹理也是游戏开发中的重点,由于条件限制,大家可以测试更多种类的纹理以及其不同的映射方式。为了使游戏更加完美,下一文我们将介绍更适合游戏中物体的表现方式——模型。
分享到:
评论

相关推荐

    opengl纹理映射(下)

    本篇文档将会深入讲解OpenGL纹理映射的原理和实现细节,适合初学者进行学习。 首先我们来了解一下纹理映射的基本概念。在OpenGL中,纹理映射是将一张二维图片映射到三维模型表面的过程。这样做可以让图形的表面具有...

    opengl纹理映射的例子。

    OpenGL纹理映射是一种在3D图形编程中广泛应用的技术,它允许我们将二维图像(通常称为纹理)贴附到3D模型的表面,以增加视觉细节和真实感。在本例中,我们将探讨如何利用Microsoft Foundation Class (MFC)库与OpenGL...

    opengl纹理映射

    OpenGL纹理映射是一种在3D图形编程中广泛应用的技术,它允许我们将2D图像(纹理)贴合到3D模型的表面,从而增加视觉的真实感和复杂性。在本主题中,我们将深入探讨如何使用OpenGL对一个六面体进行纹理映射。 首先,...

    OpenGL纹理映射

    ### OpenGL纹理映射详解 #### 一、简介 OpenGL 是一种用于渲染 2D 和 3D 图形的标准规范,广泛应用于游戏开发、虚拟现实、科学可视化等领域。纹理映射是 OpenGL 中的一项关键技术,它允许将图像(纹理)贴附在 3D ...

    opengl纹理映射(上)

    ### OpenGL纹理映射详解(上) #### 一、引言 纹理映射是现代计算机图形学中的一个重要概念,尤其在三维图形渲染中占有极其重要的地位。通过纹理映射技术,可以使三维模型表面更加逼真、细腻,从而极大地提升场景...

    Qt OpenGL纹理映射Demo

    **Qt OpenGL纹理映射Demo详解** 在计算机图形学领域,OpenGL是一种广泛使用的跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。而Qt则是一个功能强大的C++图形用户界面应用程序框架,它支持使用OpenGL进行高性能...

    OpenGL纹理映射实例教程

    OpenGL纹理映射是一种在3D图形中给模型表面贴上图片的技术,可以让模型看起来更加丰富和真实。OpenGL纹理映射实例教程详细介绍了如何使用OpenGL进行纹理映射,其中包括了对载入不同格式图片类Texture的讲解,这个类...

    Qt下Opengl纹理映射实例:正方体(可拖动旋转)

    首先,我们需要理解OpenGL纹理映射的基本概念。纹理映射是将二维图像(纹理)贴附到三维模型表面的技术,以此增加模型的视觉细节。在OpenGL中,我们使用`glGenTextures()`函数生成纹理ID,然后使用`glBindTexture()`...

    OpenGL纹理映射(1)_opengl_

    OpenGL纹理映射是计算机图形学中的一个重要概念,用于在3D模型或2D图像上应用颜色和细节。在OpenGL编程中,纹理映射允许我们利用二维图像(纹理)来装饰三维物体,使得视觉效果更加丰富和真实。在这个项目中,我们将...

    opengl 纹理映射

    纹理映射是OpenGL中的一个重要概念,它允许我们为几何对象表面贴上图像,从而增加视觉细节和真实感。在本场景中,我们将探讨如何在OpenGL中实现纹理映射,特别是将不同纹理应用到立方体的六个面上,并使其能够旋转。...

    opengl纹理与映射原理及案例资料

    1. OpenGL纹理: 纹理是二维图像数据,可以将其理解为贴在3D模型表面的一张图片。OpenGL支持多种类型的纹理,包括2D纹理、3D纹理、立方体贴图等。纹理的使用提升了渲染效率,因为它允许GPU一次性处理大量像素信息,...

    22_MultiTexture.rar_22_MultiTexture_OPENGL 纹理_opengl 纹理映射_立方体 纹理

    在这个“22_MultiTexture”项目中,我们聚焦于OpenGL的多纹理映射技术,这是一种在3D模型上应用多个纹理图像的技术,以增强视觉效果。 纹理映射是3D图形中的一个关键概念,它涉及到将2D图像(纹理)贴在3D物体的...

    C#编程(纹理映射 OPENGL)

    本项目“C#编程(纹理映射 OPENGL)”是利用C#语言和OpenGL库来实现三维场景中的纹理映射技术。纹理映射是图形学中的一个重要概念,它将二维图像(纹理)应用到三维模型表面,增加视觉真实感。 首先,我们需要理解...

    OpenGL 纹理映射

    本资源适合于初学或者熟练掌握OPENGL的学者,主要是巩固对opengl中纹理映射的学习。

    Qt_OpenGL纹理映射

    纹理映射基础知识 什么叫纹理映射,一开始我也不明白,感觉这个词好专业(毕竟没有学过图形学),后面经过网上查找资料和这次实验稍微理解了点。纹理映射简单的讲,就是把一个纹理(其实说白了,纹理可以理解为一幅图像...

    opengl纹理贴图例子

    本示例程序是一个基础的OpenGL应用,主要展示了如何在四面体上实现纹理贴图,这对于初学者理解OpenGL纹理映射的概念非常有帮助。 纹理贴图是将二维图像(纹理)应用到三维模型表面的技术,它极大地增强了三维模型的...

Global site tag (gtag.js) - Google Analytics