2011-08-03 75 views
0

我想学习OpenGL,它有点令人生畏。要开始使用,我试图用它在2D图像上创建一些效果。基本上,我想拍摄一张图像(比如说1000px×1000px),并将它分成一个大小相同的正方形网格(比如说10×10的网格),然后分别操作这些正方形(比如转一个黑方块,翻转另一个方块,另一个“掉落”在屏幕上等)。我已经按照一些基本的在线说明(http://blog.jayway.com/2010/12/30/opengl-es-tutorial-for-android-%E2%80%93-part-vi-textures/)如何将纹理映射到简单的正方形,但是我在将纹理映射到更复杂的多个正方形排列时遇到了问题。如何将纹理应用于使用OpenGL的方格网格

1)给定一个2×2(和更大尺寸)的正方形网格,我如何在整个网格上映射单个纹理/图像?也就是说,OpenGL期望的纹理坐标(以及按什么顺序)可以使这项工作成为可能?我似乎无法围绕如何弄清大型多边形结构上“UV”坐标的顺序。 2)由于我最终会转换,旋转等网格的每个单独的平方,最好是创建网格的每个平方,并单独划分纹理/位图并将每个图像应用于每个广场分开?如果是这样,你有什么建议如何有效地将位图分成几块?

任何和所有帮助,链接,建议等将不胜感激。我在一个支持OpenGL ES 2的Android应用程序中这样做,但我认为大多数OpenGL讨论/概念都是平台不可知的。如果可能的话,我不想包含一些大框架或工具包来做这件事,因为我想要很多速度和最小尺寸。

回答

1

从更重要的回复#2开始,您真的不想做比您绝对需要的更多的纹理开关。他们是一个疯狂的表现损失。

回到#1,你这样做的方式其实很简单。您的纹理位于坐标(0,0)至(1,1)的单位方块的中。这被称为纹理空间坐标,轴被分别称为U和V.所以每个都在0到1之间,并覆盖整个图像。

现在当你创建你的对象时,通过顶点(通过顶点缓冲区或立即)来创建顶点,你可以为每个顶点发送第二组坐标,UV纹理坐标。您可以使用它将您的图像“切片”成部分。

最简单的方法来做你的具体应用是取顶点坐标,除以图像长度的长度,并乘以你正在建造的小方块的长度。一旦你开始旋转你的方块,这显然不起作用,但也许它会帮助你更好地形象化过程。

请注意,这是如何完全独立于平台的,您可以使用与DirectX应用程序相同的推理或其他任何方法!

1

1)我认为你搜索的关键词是“纹理地图集”。

一些提示,但你可能会在互联网上找到更好的解释,因为我仍然在学习:(我使用OpenGl 2.1和GLSL 1。2所以因人而异)
顶点着色器有这样的事情:

uniform mat4 projectionMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 modelMatrix; 

attribute vec3 position; 
attribute vec2 texcoord; 

varying vec2 vertTexCoord; 

void main() 
{ 
    vertTexCoord = texcoord; 
    gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0f); 
} 

在片段着色器,你做这样的事情:

uniform sampler2D texture; 
varying vec2 vertTexCoord; 

void main() 
{ 
    gl_FragColor = texture2D(texture, vertTexCoord); 
} 

,然后,例如,如果你想有一个2x2的网格正方形(纹理分为4部分),你会有这样的顶点; (假设正方形是1个单位宽和高)
(UV = texcoord,顶点=位置)
square1
和下方的看起来像这样:
square2

这是有点重要的是要记住,虽然顶点坐标可以超过1且低于0,但纹理坐标不能(总是在0和1之间)。我不会划分位图,因为使用纹理地图(复数?)已经很快了,我怀疑你会获得显着的速度增益(如果有的话)。

我希望我能帮忙! (也抱歉,但我不能直接嵌入图像,请给我代表,所以我可以在将来做:))